Tengo una vista de lista con texto y botón en cada fila, la vista de lista setOnItemClickListener () no funciona. ¿Es posible manejar eventos de clic de elemento y clic de botón de manera diferente (el clic de elemento debe llamar a ActivityA y el clic de botón debe llamar a ActivityB)? Alguien tiene una solución
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"
resuelve el mío. Utilizo dos TextView en una fila LinearLayout personalizada. Yuk android ...A veces, la lista aún no podrá hacer que el escucha de clics pase. Y en este caso, es posible que deba agregar un atributo más.
Y este atributo debe agregarse al diseño más superior de su XML donde ha proporcionado los elementos ListView.
fuente
Si tiene una vista activa / vista enfocable en su vista de lista, entonces se desactivará
onItemClickListener
... puede intentar hacerla desenfocada agregando:android:focusable="false"
a cualquier vista que generalmente sea enfocable.fuente
Lo del rebozado es añadirlo tanto
Listener
al conjuntorowView
como alButton
interiorAdapter
. Algo como esto.fuente
Trate de establecer
setClickable(false)
para cada unoButton
,ImageButton
, etc, yView
de esta manera:También tienes que agregar
al diseño principal (primer nivel)
fuente
En lugar de agregar un botón, agregue
ImageView
y proporcione unsetOnItemClcik
oyente que funcionaría bien.fuente
También recibo el mismo error. Si en la lista de distribución que tiene cualquier botón para sustituirlo por
TextView
ejemploImageButton
conImageView
. Para referencia, su es mi código:También tenga en cuenta hacer el diseño de la lista como
android:focussable="true"
y para el uso de ese botón / parámetro de textoandroid:focussable="false"
.fuente
Agregue un
android:focusable="false"
atributo al botón y a la vista principal agregue unandroid:descendantFocusability="blocksDescendants"
atributo como este.fuente
Es sorprendente notar que la forma en que XML cambió hace que setonitemclicked en java funcione para mí.
fuente
Haga que el atributo principal en el que se puede hacer clic sea falso de esta manera
android:clickable="false"
.De nuevo frente al problema, luego para todas las vistas secundarias agregue este falso en el que se puede hacer clic.
fuente
No sé exactamente por qué, pero a veces cuando configura el adaptador, los oyentes se borran. Entonces, debe llamar
setOnClickListener
después desetAdapter
osetListAdapter
.fuente
Eliminar
android:clickable="true"
de la vista personalizada interna delListView
.fuente