Activity
código da classe:
conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
A getView
função na Adapter
classe:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
Existe um problema com o uso de dois xmls ao inflar?
Respostas:
Acabei de encontrar uma solução a partir daqui, mas com um clique profundo.
Se qualquer item de linha da lista contiver uma exibição focável ou clicável,
OnItemClickListener
não funcionará.O item de linha deve ter um parâmetro semelhante
android:descendantFocusability = "blocksDescendants"
.Aqui você pode ver um exemplo de como deve ser o item da sua lista. O item da lista xml deve ser ...
row_item.xml
(your_xml_file.xml
)fonte
listView.setDescendantFocusability(int focus);
ondefocus
está um dosViewGroup.FOCUS_BEFORE_DESCENDANTS
,ViewGroup.FOCUS_AFTER_DESCENDANTS
ouViewGroup.FOCUS_BLOCK_DESCENDANTS
O problema é que seus layouts contêm itens focáveis ou clicáveis. Se uma exibição contiver itens focáveis ou clicáveis, o OnItemCLickListener não será chamado.
Clique aqui para mais informações.
Poste um dos seus xmls de layout, se esse não for o caso.
fonte
EditText
s paraTextView
s, e eleCheckBox
foi autorizado a permanecer (e permanecer alternável) comandroid:descendantFocusability="blocksDescendants"
adicionado ao meuLinearLayout
.android:focusableInTouchMode="true"
para a linha, uma vez removido, começou a trabalhar, finalmente! :-)Para minhas listas, minhas linhas têm outras coisas que podem ser clicadas, como botões, para fazer um cobertor
blocksDescendants
não funcionar. Em vez disso, adicionei uma linha no xml do botão:Isso evita que os botões bloqueiem os cliques nas linhas, mas ainda permite que os botões recebam os cliques.
fonte
você precisa executar 2 etapas em seu listview_item.xml
android:descendantFocusability="blocksDescendants"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
Aqui está um exemplo: listview_item.xml
fonte
clickable="true
na exibição do item fará com que oonItemClick
não seja chamado. Portanto, preste atenção para adicionar tambémclickable="false"
na visualização raiz do item, neste caso, é oLinearLayout
use o código abaixo na tag do botão no layout de linha personalizado do listview
fonte
android:descendantFocusability="blocksDescendants"
e bloquear estes caixa de seleção cliqueEu tive o mesmo problema e acabei de ver que havia definido acidentalmente:
na minha classe CustomListViewAdapter.
Alterando isso para:
Eu consegui resolver o problema. Caso alguém tenha cometido o mesmo erro ...
fonte
@Override public void onApplicationStart { ExplodeThisDevice(); }
Usar android: descendente
Adicionar acima no layout raiz
fonte
Eu o resolvi com a ajuda desta resposta
1. Adicione o seguinte no Layout linear de list_items.xml
android:descendantFocusability="blocksDescendants"
2.Vistas para crianças do LinearLayout em list_items.xml
fonte
se você tiver visualizações de texto, botões ou stg clicáveis ou selecionáveis apenas na exibição de linha
não é o suficiente. Você tem que definir
para suas visualizações de texto e
aos seus botões e outros itens focáveis.
fonte
Mesmo com o mesmo problema, estou com a caixa de seleção, fiz o seguinte para mascarar o itemClickListener,
Adicionadas as seguintes propriedades à caixa de seleção,
e ItemClickListner começaram a trabalhar.
Para um exemplo detalhado, você pode acessar o link,
http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/
Espero que ajude Cheers !!
fonte
Eu tive o mesmo problema e tentei todas as soluções mencionadas sem sucesso. através de testes, descobri que tornar o texto selecionável estava impedindo que o ouvinte fosse chamado. Então, alternando para false ou removendo, meu ouvinte foi chamado novamente.
espero que isso ajude alguém que estava preso como eu.
fonte
Adicione isso no layout principal
Escreva esse código em todos os botões, TextView, ImageView etc. que tenham onClick
Espero que funcione.
fonte
Duas soluções impressionantes foram: se o seu ListFragment de extensão de um fragmento souber que
mListView.setOnItemClickListener
não será chamado antes da criação da sua atividade, isso garantirá que seja definido quando a atividade for criadaEnquanto olhava para o código-fonte do ListFragment, me deparei com isso
Um
onItemClickListener
objeto é anexado e chamaonListItemClick()
Como tal, a outra solução semelhante, que funciona exatamente da mesma maneira, é substituironListItemClick()
fonte
no meu caso, nenhuma das propriedades de layout xml não foi útil.
Acabei de adicionar uma única linha de código como esta: convertView.setClickable (false);
basicamente, ele faz a mesma coisa que configurar propriedades no layout xml, mas foi a única coisa que funciona no meu caso.
Não é o momento perfeito, mas talvez ajude alguém Feliz codificação
fonte
Eu tentei tudo o que precede e NADA funcionou.
Resolvi o problema da seguinte maneira:
Primeiro, defino um botão personalizado chamado
ListButton
O XML se parece com:
Em seguida, defino minha própria
ButtonClicked
interface do Ouvinte:Então eu uso meu próprio ouvinte como se fosse o normal
OnClickListener
:fonte
Eu tive o mesmo problema, estava usando um estilo para meus textos no layout de linha que tinha o atributo "focalizável". Funcionou depois que eu o removi.
fonte
No meu caso, tive que remover a próxima linha do
Layout
fonte
Android: o atributo autoText também torna o TextView automaticamente focável.
fonte
Se você deseja usar o clique simples e o clique longo nos itens de exibição em lista, a melhor maneira de implementar isso seria usar o menu de contexto para um clique longo. Evite usar setItemLongClickListener, especialmente se você tiver vários layouts de linha para sua exibição de lista.
fonte
Enfrentou o mesmo problema, tentou por horas. Se você tentou todas as opções acima, tente alterar layout_width do Listview e item de lista para match_parent de wrap_content.
fonte
Todas as opções acima falharam para mim. No entanto, consegui resolver o problema (depois de muitas horas batendo na cabeça - Google, se você estiver ouvindo, considere corrigir o que encontrei abaixo na forma de erros do compilador, se possível)
Você realmente precisa ter cuidado com os atributos do Android adicionados ao seu layout xml aqui (nesta pergunta original, isso é chamado de list_items.xml). Para mim, o que estava causando o problema era que eu havia mudado de uma visualização EditText para uma TextView e tinha sobras de atributos da alteração (no meu caso, inputType). O compilador não pegou e a clicabilidade falhou quando fui executar o aplicativo. Verifique todos os atributos que você possui nos nós xml do layout.
fonte
Em sua atividade, use adapter.setOnItemClickListener () antes de anexá-lo à lista.
Copiado do github funcionou para mim
fonte
O que funcionou para mim foi adicionar o código abaixo a todas as subvisões dentro do layout do meu arquivo row.xml:
Então, no meu caso:
E esta é minha chamada setOnItemClickListener na minha subclasse Fragment:
Eu tenho a resposta daqui !
fonte
Resolvi o problema removendo as visualizações clicáveis da lista.
fonte