Eu tenho uma exibição de lista com texto e botão em cada linha, exibição de lista setOnItemClickListener () não está funcionando. é possível lidar com eventos de clique de item e clique de botão de maneira diferente (o clique do item deve chamar ActivityA e o clique do botão deve chamar ActivityB). Alguém tem uma solução
private ArrayList<String> userIDArr = null;
private ArrayList<String> userNameArr = null;
private DatabaseHelper dbHelper = null;
private ListView userListView=null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
dbHelper = new DatabaseHelper(this.getApplicationContext());
Map<String,ArrayList<String>> displayMap = dbHelper.getUserListToDisplay();
userIDArr = displayMap.get("UserID");
userNameArr = displayMap.get("FirstName1");
userListView = (ListView) findViewById(R.id.listView2);
userListView.setAdapter(new UserListAdapter(this,userIDArr));
userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Toast.makeText(usersListActivity.this,
"Item in position " + position + " clicked", Toast.LENGTH_LONG).show();
}
});
}
public class UserListAdapter extends ArrayAdapter<String>
{
Activity context;
public UserListAdapter(Activity context, ArrayList<String> names) {
super(context, R.layout.list_item, names);
this.context = context;
}
private class ViewHolder {
public TextView UserNameAndID;
public TextView Description;
public Button UploadBtn;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.list_item, null, true);
holder = new ViewHolder();
holder.UserNameAndID = (TextView) rowView.findViewById(R.id.User_detailsTxt);
holder.Description = (TextView) rowView.findViewById(R.id.User_status);
holder.UploadBtn = (Button) rowView.findViewById(R.id.uploadbutton);
holder.UploadBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(usersListActivity.this," Button clicked",Toast.LENGTH_SHORT).show();
}
});
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
String s = userNameArr.get(position)+","+userIDArr.get(position);
holder.UserNameAndID.setText(s);
holder.Description.setText("U r in middle");
return rowView;
}
}
}`
android:focusableInTouchMode="false"
resolve o meu. Eu uso dois TextView em uma linha LinearLayout personalizada. Yuk android ...Às vezes, a lista ainda não será capaz de fazer o Click Listener passar. E, neste caso, você pode ter que adicionar mais um atributo.
E esse atributo deve ser adicionado ao layout superior de seu XML, onde você forneceu os elementos ListView.
fonte
Se você tiver uma visão ativa / visão focalizável em sua visão de lista, então ela será desativada
onItemClickListener
... você pode tentar torná-la não focável adicionando:android:focusable="false"
a qualquer visão que normalmente é focalizável.fonte
A coisa da massa é adicionar tanto
Listener
ao todorowView
quanto aoButton
interiorAdapter
. Algo assim.fonte
Tente definir
setClickable(false)
para cadaButton
,ImageButton
etc, eView
assim:Além disso, você tem que adicionar
para o layout principal (primeiro nível)
fonte
Em vez de adicionar o botão, adicione
ImageView
e forneça umsetOnItemClcik
ouvinte que funcionaria bem.fonte
Também estou recebendo o mesmo erro. Se no layout da lista você tiver qualquer botão para substituí-lo por
TextView
ieImageButton
porImageView
. Para referência, é o meu código:Lembre-se também de fazer o layout da lista como
android:focussable="true"
e para aquele botão / parâmetro de texto usadoandroid:focussable="false"
.fonte
Adicionar
android:focusable="false"
atributo ao botão e à visão pai adicionarandroid:descendantFocusability="blocksDescendants"
atributo como este.fonte
É incrível notar que como o XML mudou faz com que o setonitemclicked em java funcionou para mim.
fonte
Faça com que o atributo pai clicável seja falso como este
android:clickable="false"
.Novamente enfrentando o problema, então, para todas as visualizações filhas, adicione este falso clicável.
fonte
Não sei exatamente por que, mas às vezes quando você configura o adaptador, os ouvintes são limpos. Então, você deve ligar
setOnClickListener
depois desetAdapter
ousetListAdapter
.fonte
Remova
android:clickable="true"
da vista interna do clienteListView
.fonte