web-dev-qa-db-fra.com

ListView setOnItemClickListener ne fonctionne pas en ajoutant un bouton

J'ai une vue liste avec le texte et le bouton dans chaque ligne, la vue liste setOnItemClickListener () ne fonctionne pas. Est-il possible de gérer les événements de clic d'élément et de clic de bouton différemment (un clic d'élément doit appeler ActivityA et un 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;
        }
    }
}`
87
Kishore

Essayez de définir vos boutons (ou toute autre vue que vous souhaitez gérer, cliquez dans un élément de la liste) comme suit:

Android:focusable="false"
Android:focusableInTouchMode="false"
258
Ben Lee

Parfois, la liste ne pourra toujours pas faire passer le listener de clic. Et dans ce cas, vous devrez peut-être ajouter un attribut supplémentaire.

Android:descendantFocusability="blocksDescendants" 

Et cet attribut doit être ajouté à la plus haute disposition de votre XML où vous avez fourni les éléments ListView.

116
Andro Selva

Si vous avez une vue active/une vue focalisable dans votre vue liste, cela désactivera onItemClickListener... vous pouvez essayer de la rendre non focalisable en ajoutant: Android:focusable="false" à n’importe quelle vue qui est habituellement mise au point.

14
nilesh

La chose la plus efficace est d’ajouter Listener à l’ensemble du rowView et au Button à l’intérieur de Adapter. Quelque chose comme ça.

public class MyAdapter extends BaseAdapter implements View.OnClickListener{

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
            View rowView = convertView;
            if(rowView == null)
            {
                    //intialize rowView, and set onclick listener only once.
                    rowView = someIntilizationMehhodOrInflatorMethod();
                    //add listener to the button also and also to the row view
                    rowView.setOnClickListener(this);
            }
            //all your inflation and setting values goes here and at the end,
            //set position as tag to get the correct position, rather buggy one.
            rowView.setTag(String.valueOf(position));


            return rowView;
    }
    public void onClick(View v)
    {
            //now get the tag of View v and convert it to integer.
            int pos = Integer.parseInt(v.getTag().toString());
            Toast.makeText(context,"Item in position " + pos + " clicked",Toast.LENGTH_LONG).show();
    }
}
8
Adil Soomro

Essayez de définir setClickable (false) pour chaque Button, ImageButton, etc et View comme ceci:

    view.setClickable(false);
    button.setClickable(false);
    imagebutton.setClickable(false);

Aussi vous devez ajouter

Android:descendantFocusability="blocksDescendants"

à la disposition principale (premier niveau)

5
Vlad

Au lieu d’ajouter un bouton, ajoutez imageview et fournissez setOnitemclcik listner qui fonctionnerait correctement

            public View getView(final int position, View convertView, ViewGroup parent) {
            MyViewHolder mViewHolder;
            if(convertView == null) {
                    convertView = inflater.inflate(R.layout.youtubesearchrow, null);
                    mViewHolder = new MyViewHolder();
                    mViewHolder.alarm = (ImageView)convertView.findViewById(R.id.alarm);
                    convertView.setTag(mViewHolder);
            } else {
                    mViewHolder = (MyViewHolder) convertView.getTag();
            }

            mViewHolder.tvTitle = detail(convertView, R.id.tvTitle,    
           // mViewHolder.tvDesc  = detail(convertView, R.id.tvDesc,  
            mViewHolder.ivIcon  = detail_image(convertView, R.id.ivIcon,  

            mViewHolder.alarm.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                }
            });

            return convertView;
    }
2
sharath yadhav

Je reçois aussi la même erreur. Si vous avez un bouton dans la liste, remplacez-le par textView i.e ImageButton par ImageView. Pour référence leur est mon code:

  private Activity activity;
private LayoutInflater inflater;

private List<ItemList> itemListsItems;

private Bookmark_SharedPref pref;

ImageLoader imageLoader = AppController.getInstance().getImageLoader();

public CustomListAdapter_Item(Activity activity,List<ItemList> itemListsItems){
    this.activity=activity;
    this.itemListsItems=itemListsItems;
    pref = new Bookmark_SharedPref(activity);
}


@Override
public int getCount() {
    return itemListsItems.size();
}

@Override
public Object getItem(int position) {
    return itemListsItems.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    View v = convertView;
    ViewHolder holder;

    if(inflater == null){
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    if(convertView == null){
        convertView = inflater.inflate(R.layout.item_layout,null);

        holder = new ViewHolder();
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder)convertView.getTag();
    }


    if(imageLoader == null){
        imageLoader = AppController.getInstance().getImageLoader();
    }




     holder.img = (NetworkImageView)convertView.findViewById(R.id.item_image);
    holder.Title = (TextView)convertView.findViewById(R.id.item_title);
    holder.Cat = (TextView)convertView.findViewById(R.id.item_category);

    holder.id = (TextView)convertView.findViewById(R.id.itemid);

    holder.Desc = (TextView)convertView.findViewById(R.id.item_description);

    holder.book = (ImageView)convertView.findViewById(R.id.bookmark_star);



    // getting blog data or the row
    ItemList il = itemListsItems.get(position);

    //setting image
    holder.img.setImageUrl(il.getImageUrl(), imageLoader);

    // setting title
    holder.Title.setText(il.getTitle());

    //setting category
    holder.Cat.setText(il.getCategory());


    //setting blog id
    holder.id.setText(il.getId());

    //setting description
    holder.Desc.setText(il.getDescription());

    //bookmarking the post
    holder.book.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            itemListsItems.get(position).isFav = !itemListsItems.get(position).isFav;
            ((ImageView)v.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);

            if(itemListsItems.get(position).isFav){
                String data = Integer.toString(itemListsItems.get(position).id);
                Toast.makeText(v.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
                pref.addPref(data);
            } else {
                String data = Integer.toString(itemListsItems.get(position).id);
                Toast.makeText(v.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
                pref.removePref(data);
            }
            //notifyDataSetChanged();
        }
    });

    ((ImageView)convertView.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);

    /*
    if(itemListsItems.get(position).isFav){
        String data = Integer.toString(itemListsItems.get(position).id);
        Toast.makeText(convertView.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
        pref.addPref(data);
    } else {
        String data = Integer.toString(itemListsItems.get(position).id);
        //Toast.makeText(convertView.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
        pref.removePref(data);
    }
    */
    return convertView;
}

private static class ViewHolder {
   public TextView Title, Desc,Cat,id;
    ImageView book;
    NetworkImageView img;
}

Gardez également à l'esprit de faire en sorte que la disposition de la liste soit sous Android: focussable = "true" et que pour ce bouton/paramètre de texte, utilisez Android: focussable = "false"

1
Mukul Aggarwal

supprimer Android: clickable = "true" de la vue en costume d'époque de la liste

0
Hamid Jolany

Ajouter Android: focusable = "false" attribut au bouton et à la vue parent add Android: descendantFocusability = "blocksDescendants" attribut comme ceci.

<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:descendantFocusability="blocksDescendants">

    <ImageButton
        Android:id="@+id/sell_button"
        Android:layout_width="wrap_content"
        Android:focusable="false"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_sell" />
</RelativeLayout>
0
Süheyl Kawsara

Attribuez à false l'attribut parent cliquable comme ceci 'Android: clickable = "false"'.

  <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:clickable="false"
        Android:orientation="vertical"
        >

Là encore, face à un problème, alors pour toutes les vues enfants, ajoutez ce faux cliquable.

0
REMITH

Je ne sais pas exactement pourquoi, mais parfois, lorsque vous configurez l'adaptateur, les écouteurs sont effacés. Ensuite, vous devez appeler setOnClickListener après setAdapter ou setListAdapter.

0
Tiago Gouvêa