【问题标题】:setOnItemClickListener() not working on custom ListView @ AndroidsetOnItemClickListener() 不适用于自定义 ListView @ Android
【发布时间】:2009-10-05 05:06:16
【问题描述】:

我通过为每一行扩展LinearLayout 来实现自定义ListView。每行都有一个小缩略图、一个文本和一个check boxlist view 已正确部署,我可以毫无问题地滚动和浏览它。

但是ListView 似乎根本没有响应setOnItemClickListener(),所以我不得不通过在每行内的文本的getView() 中设置点击侦听器来找到解决方法,这显然是在创建问题时我正在尝试重用adapter。有人有解决办法吗?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    试试这个
    对于 ListView,

    final ListView list = (ListView) findViewById(R.id.list);
    list.setItemsCanFocus(false);
    

    另外,请确保列表项内的 CheckBox 设置焦点为 false

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

    【讨论】:

    • 我遇到了同样的问题,上述解决方案适用于检测行上的点击,但我的自定义 ListView 行中有 2 个按钮。如何判断点击了哪个按钮?谢谢
    • @longhairedsi: 请在getView()方法中加入以下代码 button1.setFocusable(false); button2.setFocusable(false); button1.setFocusableInTouchMode(false); button2.setFocusableInTouchMode(false); button1.setOnClickListener(this); button2.setOnClickListener(this);在您的适配器(或您希望的位置......)中为按钮实现您的点击监听器 也为列表视图设置点击监听器.....现在检查您的点击是否适用于.....listview以及按钮也
    • 您如何将上述解决方案用于listFragment
    • 这是可行的,但是对于有问题的“视图”,属性android: clickable 必须为假。注意“View”的父母不要使用“android:clickable”。这将阻止您的列表或衍生产品的模式选择器。您可以使用属性android: foreground 将模式选择器与自定义选择器匹配,如下所示:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:fitsSystemWindows="true"> <FrameLayout "android: foreground="CUSTOM SELECTOR""> <RelativeLayout><RelativeLayout/> <.../> <.../>
    【解决方案2】:

    老答案:我写在previous post here

    android:focusable="false"
    android:clickable="false"
    

    ImageButton 在自定义视图中时无济于事。在运行时必须使用 button.setFocusable(false);(来自 java 源代码)

    编辑: 还有更优雅的解决方案。尝试在列表元素的根布局中添加android:descendantFocusability="blocksDescendants"。这将使点击 onListItem 成为可能,并且您可以单独处理 Button 或 ImageButton 点击​​

    【讨论】:

      【解决方案3】:

      对于您将项目视图设置为 CheckBox 的 ListView

      android:focusable="false"
      android:clickable="false"
      

      http://code.google.com/p/android/issues/detail?id=3414

      【讨论】:

        【解决方案4】:

        设置这些属性:

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

        list_item.xml 文件中的所有 UI 元素。

        如果您的适配器集中没有解决这个问题:

            v.imageView.setFocusable(false);
            v.imageView.setFocusableInTouchMode(false);
        

        【讨论】:

          【解决方案5】:

          您是否在扩展适配器类中创建了任何 ViewHolder?如果是,那么在 setOnItemClickListener() 中创建一个占位符的实例,可能会像这样工作。

          @Override
              protected void onListItemClick(ListView l, View v, int position, long id) {        
                  View rowView = v;
                  if (rowView == null) {
                      LayoutInflater inflater = this.getLayoutInflater();
                          // GET INFLATE OF YOUR LAYOUT.
                      rowView = inflater.inflate(R.layout.projectpeopledescrate, null);
                       // CUSTOM ViewHolder Class Created in Adapter.
          // name,title,comment are my components on the same listview clicked item.
                      PPDViewHolder viewHolder = new PPDViewHolder();
                      viewHolder.name     = (TextView) rowView.findViewById(R.id.ppeopledescrvname);
                      viewHolder.title    = (TextView) rowView.findViewById(R.id.ppeopledescrvtime);
                      viewHolder.comment  = (TextView) rowView.findViewById(R.id.ppeoplervcomment);
                      viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
                      rowView.setTag(viewHolder);
                  }
                    // ANOTHER object instance to apply new changes.
                  PPDViewHolder holder = (PPDViewHolder) rowView.getTag();
          // I've setted up visibility over the components. You can set your onClickListener over your buttons.
                  holder.comment.setVisibility(View.GONE);
                  holder.name.setVisibility(View.GONE);
                  holder.title.setVisibility(View.GONE);
                  holder.hiddenLayout.setVisibility(View.VISIBLE);
                  holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT));
                  holder.hiddenLayout.bringToFront();
          
              }
          

          希望,你想要同样的东西。祝你好运!

          【讨论】:

            【解决方案6】:

            我有这个代码

            this.mListView.setOnItemClickListener(new OnItemClickListener() {
            
                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                            Log.v(TAG,"loul");
                        }
                    });
            

            但是没用

            所以我刚刚在下面放了一个 onItemSelectedListener 并且它可以工作 Oo:

            this.mListView.setItemsCanFocus(false);
            this.mListView.setOnItemClickListener(new OnItemClickListener() {
            
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
                    Log.v(TAG,"loul");
                }
            });
            //listener for nothing but it allow OnItemClickListener to work
            this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() {
            
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            
                }
            
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
            
                }
            });
            

            【讨论】:

              猜你喜欢
              • 2023-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-01
              • 1970-01-01
              • 2011-06-10
              相关资源
              最近更新 更多