l'ajout de CheckBox à la ligne de liste perd mes événements onItemClick?
J'ai une ListView avec une liste de tableaux de l'adaptateur. Les lignes ne sont pas très complexe (une Image sur la gauche, un LinearLayout avec TextViews à l'intérieur, et une Case à cocher sur la droite ... la mise en page est copiée ci-dessous.) Le but est d'avoir un QuickAction barre de venir si l'utilisateur clique sur l'image ou le texte, et la Case se trouvant à changer d'état si l'utilisateur clique sur la Case à cocher. J'ai chaque partie travailler de manière indépendante, mais pas quand ils sont ensemble dans la mise en page - j'ai l'impression de perdre le onItemClick événement.
La "QuickAction" bar est activé par OnItemClickListener(), et il fonctionne très bien - à moins que j'ai la Case à cocher dans la mise en page, dans ce cas la Case fonctionne très bien (à l'aide de onClick ()), mais les onItemClickListener n'est jamais déclenché lorsque l'utilisateur clique sur la ligne, mais en dehors de la Case. La mise en page (sans style stuff) est:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vw1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView android:id="@+id/img"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox android:id="@+id/ckb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:checked="false" />
<!-- stack text in middle section of the row -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content""/>
<TextView android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
Le code derrière il n'est pas compliqué:
public class ListGroupsActivity extends BaseActivityForList {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
//add QuickAction bar
ListView lv = getListView();
lv.setOnItemClickListener(new QAListener(this));
}
}
//inner classes of the ListGroupsActivity
class CbOnClickListener implements OnClickListener {
//...
//test the checkbox isChecked() and keep state in 'selectedItems' array
class GroupListAdapter extends ArrayAdapter<Group> {
super(/*...*/)
CbOnClickListener cblistener = null; //common listener for all the CheckBoxes
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//here do normal testing for convertView being null etc
//heres the view inflation from the layout into the ViewHolder
holder.tv1 = (TextView) convertView.findViewById(R.id.text1);
holder.tv2 = (TextView) convertView.findViewById(R.id.text2);
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.ckb = (CheckBox) convertView.findViewById(R.id.ckb);
Group g = groups.get(position); //this is the data obj for the row
holder.tv1.setText(g.getName());
holder.tv2.setText("child groups");
Bitmap bm = BitmapFactory.decodeFile(g.getIconUri());
holder.img.setImageBitmap(bm);
Integer key = (Integer) g.getId();
holder.ckb.setChecked(selectedItems.contains(key));
holder.ckb.setOnClickListener(cblistener); //hook onClick to cblistener
return convertView;
}
La QAListener est dans une super-classe de toutes les ma liste des activités:
public class BaseActivityForList extends
OrmLiteBaseListActivity<DatabaseHelper> {
//QAListener inner class, constructs new quick action bar when item clicked
class QAListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//has three ActionItem instances, 'copyAction', 'delAction', 'editAction'
ActionItem copyAction = new ActionItem();
copyAction.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//... does some stuff
mQuickAction.dismiss();
}
}); //end setOnClickListener
} //end onItemClick
} //end QAListener
} end BaseActivityForList
Alors, comment dois-je faire pour la Case à cocher pour ramasser le onClick, et le reste de l'élément de la liste pour ramasser les onItemClick()?
source d'informationauteur Wayne
Vous devez vous connecter pour publier un commentaire.
Après quelques heures de débogage et de la recherche. J'ai eu de travail par
réglage des propriétés suivantes sur la case à cocher:
Aussi ImageView peut-être besoin d'être configuré comme décrit dans http://blog.sachin.name/?p=62 (Merci à la personne)
De mon côté, j'ai découvert que le point de vue ne DOIT PAS être cliquable et le texte ne doit pas être cliquable. Il m'a fallu un certain temps pour réaliser que j'ai appelé setClickable(true) sur mon point de vue, quelque part dans le code.
Juste pour compléter ce acceptée réponse: en cas de
ImageButton
au lieu deCheckBox
il ne suffit pas de mettre en xmlfocusable
etfocusableInTouchMode
de faux, mais au cours de l'exécution focusable besoin d'être définie sur false. Que signifie pour vous assureronItemClick
sera détecté qu'on doit faire qch comme:donc les choses fonctionnent complètement.. Original crédits à l'auteur ici . j'espère que ça aidera quelqu'un.
Acclamations 😉
Edit: Il existe même une solution plus élégante essayez d'ajouter
android:descendantFocusability="blocksDescendants"
dans la racine de la mise en page de l'élément de la liste. Que vont faire les clics onListItem possible et séparément u peut le Bouton de la poignée ou ImageButton clics