J'ai une vue de liste avec du texte et un bouton dans chaque ligne, la vue de liste setOnItemClickListener () ne fonctionne pas. est-il possible de gérer différemment les événements de clic d'élément et de clic sur un bouton (le clic d'élément doit appeler ActivityA et le clic de bouton doit appeler ActivityB). Quelqu'un a-t-il une solution
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"
résout le mien. J'utilise deux TextView dans une ligne LinearLayout personnalisée. Yuk android ...Parfois, la liste ne pourra toujours pas faire passer l'écouteur de clic. Et dans ce cas, vous devrez peut-être ajouter un autre attribut.
Et cet attribut doit être ajouté à la mise en page la plus haute de votre XML où vous avez fourni les éléments ListView.
la source
Si vous avez une vue active / une vue focalisable dans votre vue de liste, elle sera désactivée
onItemClickListener
... vous pouvez essayer de la rendre non focalisable en ajoutant:android:focusable="false"
à toute vue qui est généralement focalisable.la source
Le truc de la pâte est d'ajouter à la fois
Listener
à l'ensemble durowView
et à l'Button
intérieurAdapter
. Quelque chose comme ça.la source
Essayez de mettre
setClickable(false)
pour chaqueButton
,ImageButton
, etc etView
comme ceci:Vous devez également ajouter
à la disposition principale (premier niveau)
la source
Au lieu d'ajouter un bouton, ajoutez
ImageView
et fournissez unsetOnItemClcik
écouteur qui fonctionnerait bien.la source
J'obtiens également la même erreur. Si dans la mise en page de la liste vous avez un bouton pour le remplacer par
TextView
ieImageButton
parImageView
. Pour référence, c'est mon code:Gardez également à l'esprit de faire la mise en page de la liste au fur
android:focussable="true"
et à mesure de l'utilisation de ce bouton / paramètre de texteandroid:focussable="false"
.la source
Ajoutez un
android:focusable="false"
attribut au bouton et à la vue parent, ajoutez unandroid:descendantFocusability="blocksDescendants"
attribut comme celui-ci.la source
Il est étonnant de constater que la façon dont XML a changé provoque le setonitemclicked en java a fonctionné pour moi.
la source
Rendez l'attribut cliquable parent sur false comme ceci
android:clickable="false"
.Encore une fois face au problème, puis pour toutes les vues enfants, ajoutez ce faux cliquable.
la source
Je ne sais pas exactement pourquoi, mais parfois, lorsque vous définissez l'adaptateur, les auditeurs sont effacés. Ensuite, vous devez appeler
setOnClickListener
aprèssetAdapter
ousetListAdapter
.la source
Supprimer
android:clickable="true"
de la vue personnalisée interne duListView
.la source