【问题标题】:ListView setOnItemClickListener not working by adding buttonListView setOnItemClickListener 通过添加按钮不起作用
【发布时间】:2011-10-05 21:54:57
【问题描述】:

我有一个列表视图,每行都有文本和按钮,列表视图 setOnItemClickListener() 不起作用。是否可以以不同的方式处理项目单击和按钮单击事件(项目单击应调用 ActivityA,按钮单击应调用 ActivityB)。谁有解决办法

    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 listview


    【解决方案1】:

    尝试像这样设置您的按钮(或您想要处理单击列表项内的任何其他视图):

    android:focusable="false"
    android:focusableInTouchMode="false"
    

    【讨论】:

    • @Ben Lee:我将这些添加到我的复选框中!还是行不通。我做错了什么?
    • android:focusableInTouchMode="false" 解决了我的问题。我在自定义 LinearLayout 行中使用了两个 TextView。玉机器人...
    • ImageButton 将不起作用。在包含 ImageButton 的列表项视图中,设置 android:descendantFocusability="blocksDescendants"。
    • 添加 android:clickable="false" 也可能是必需的(在布局设计器中打开和关闭它以使其显式添加到 XML)
    • 警告:如果您使用的是 ImageButton,则需要使用 setFocusable(false),因为 ImageButton 的构造函数会在从 xml 文件膨胀后启用此属性。但是很好的答案
    【解决方案2】:

    有时列表仍然无法让 Click Listener 通过。在这种情况下,您可能必须再添加一个属性。

    android:descendantFocusability="blocksDescendants" 
    

    并且必须将此属性添加到您提供 ListView 元素的 XML 的最顶层布局中。

    【讨论】:

    • 所以没有其他人会做我刚才所做的事情:如果您的行中有需要关注的内容,例如 EditText,这将是不可取的。我现在觉得自己很蠢。
    • 就我而言,这个建议很有帮助。我有一个 TextView 和 RadioButton,第一个没有点击,第二个没有选择 TextView。我在 RadioButton 中写了“android:clickable="false"”。
    • 这是按钮为ImageButton时的解决方案
    • 奇怪的是,这个解决方案对我有用。 OnItemClickListener 在不影响后代事件的情况下工作。不知道为什么它会起作用,所以......去想一想。
    【解决方案3】:

    如果您的列表视图中有一个活动视图/可聚焦视图,那么它将禁用 onItemClickListener... 您可以尝试通过添加以下内容使其无法聚焦: android:focusable="false" 到通常可聚焦的任何视图。

    【讨论】:

      【解决方案4】:

      击球手的事情是将Listener 添加到整个rowViewButtonAdapter。 像这样。

      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();
          }
      }
      

      【讨论】:

      • 这有什么更好的地方?您正在为每个数据元素创建一个 onClickListener,而只有一个侦听器。您的示例甚至没有回收哪些视图。
      • @J.Romero 这只是一个例子,尽管还有很多代码优化空间。但是我刚刚更新了代码。
      【解决方案5】:

      尝试为每个ButtonImageButtonView 设置setClickable(false),如下所示:

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

      你也必须添加

      android:descendantFocusability="blocksDescendants"
      

      到主(第一级)布局

      【讨论】:

      • 我发现设置 blocksDescendants 就足够了,不需要取消可聚焦等。Android 4.1
      【解决方案6】:

      不要添加按钮,而是添加ImageView 并提供setOnItemClcik 侦听器,这样可以正常工作。

      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;
      }
      

      【讨论】:

        【解决方案7】:

        android:clickable="false" 一样将父可点击属性设置为 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">
        

        再次面临问题,然后为所有子视图添加这个可点击的 false。

        【讨论】:

          【解决方案8】:

          我也遇到了同样的错误。如果在列表布局中有任何按钮可以将其替换为TextView,即ImageButtonImageView。供参考,他们是我的代码:

          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;
          }
          

          还要记住将列表布局设置为android:focussable="true",并为该按钮/文本参数使用android:focussable="false"

          【讨论】:

          • 更正它应该是 android:focusable="false" 不可聚焦
          【解决方案9】:

          android:focusable="false" 属性添加到按钮和父视图添加android:descendantFocusability="blocksDescendants" 属性,如下所示。

          <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>
          

          【讨论】:

            【解决方案10】:

            令人惊讶的是,XML 的变化导致 java 中的 setonitemclicked 为我工作..

            android:descendantFocusability="blocksDescendants"
            android:focusable="false"
            android:focusableInTouchMode="false"
            

            【讨论】:

              【解决方案11】:

              我不知道确切原因,但有时当您设置适配器时,侦听器会被清除。然后,您必须在setAdaptersetListAdapter 之后调用setOnClickListener

              【讨论】:

                【解决方案12】:

                ListView 的内部客户视图中删除android:clickable="true"

                【讨论】:

                  猜你喜欢
                  • 2017-07-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-11-05
                  相关资源
                  最近更新 更多