Eu tenho um ListView
onde cada elemento da lista contém um TextView e dois botões diferentes. Algo assim:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Com este código, posso criar um OnItemClickListener
para o item inteiro:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
No entanto, não quero que o item inteiro seja clicável, mas apenas os dois botões de cada elemento da lista.
Portanto, minha pergunta é: como implementar um onClickListener para esses dois botões com os seguintes parâmetros:
int button
(em qual botão do elemento foi clicado)int position
(que é o elemento na lista em que o clique do botão aconteceu)
Atualização: Encontrei uma solução conforme descrito na minha resposta abaixo. Agora posso clicar / tocar no botão na tela de toque. No entanto, não consigo selecioná-lo manualmente com o trackball. Ele sempre seleciona o item inteiro da lista e, a partir daí, vai diretamente para o próximo item da lista, ignorando os botões, mesmo que eu tenha definido .setFocusable(true)
e setClickable(true)
pressionado os botões getView()
.
Também adicionei esse código ao meu adaptador de lista personalizado:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
Isso faz com que nenhum item da lista seja mais selecionável. Mas isso não ajudou em tornar os botões aninhados selecionáveis.
Alguém tem uma ideia?
Respostas:
A solução para isso é realmente mais fácil do que eu pensava. Você pode simplesmente adicionar no
getView()
método do seu adaptador personalizado um setOnClickListener () para os botões que você está usando.Todos os dados associados ao botão devem ser adicionados
myButton.setTag()
nogetView()
e podem ser acessados no onClickListener viaview.getTag()
Publiquei uma solução detalhada no meu blog como tutorial.
fonte
Esta é uma espécie de resposta do apêndice @ znq ...
Existem muitos casos em que você deseja saber a posição da linha de um item clicado E deseja saber em qual exibição da linha foi tocada. Isso será muito mais importante nas interfaces de usuário do tablet.
Você pode fazer isso com o seguinte adaptador personalizado:
fonte
Para futuros leitores:
Para selecionar manualmente os botões com o trackball, use:
E para desativar o foco em todos os itens da lista:
Funciona bem para mim, posso clicar nos botões com tela sensível ao toque e também permite focar um clique usando o teclado
fonte
Não tenho muita experiência do que os usuários acima, mas enfrentei o mesmo problema e resolvi-o com a solução abaixo
Evento btnRemoveClick Click
fonte
Provavelmente você descobriu como fazê-lo, mas pode ligar
e agora seus botões vão chamar a atenção
fonte
Não tenho a certeza de ser a melhor maneira, mas funciona bem e todo o código permanece no seu ArrayAdapter.
fonte
Sei que é tarde, mas isso pode ajudar, este é um exemplo de como eu escrevo uma classe de adaptador personalizada para diferentes ações de clique
fonte
A solução da plataforma para esta implementação não usa um menu de contexto exibido em um longo toque?
O autor da pergunta está ciente dos menus de contexto? O empilhamento de botões em uma exibição de lista tem implicações no desempenho, desorganiza a interface do usuário e viola o design de interface do usuário recomendado para a plataforma.
Por outro lado; menus de contexto - por natureza, sem representação passiva - não são óbvios para o usuário final. Considere documentar o comportamento?
Este guia deve lhe dar um bom começo.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
fonte