【问题标题】:how to implement a long click listener on a listview如何在列表视图上实现长点击监听器
【发布时间】:2012-02-09 10:16:54
【问题描述】:

我想在我的列表视图中添加OnLongClickListener。每当用户长按列表中的项目时,应该执行一些操作,但是我的代码没有捕获这个监听器。请让我知道我哪里出错了。类似的代码非常适用于setOnItemClickListener

代码如下:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                // TODO Auto-generated method stub
                 Log.d("in onLongClick");
                 String str=listView.getItemAtPosition(index).toString();

                 Log.d("long click : " +str);
                return true;
            }
}); 

【问题讨论】:

  • 你记得在你的类声明中添加“implements OnItemLongClickListener”吗?
  • 在xml中查看是否启用长按?
  • 也许你有一个 Gesture Listener 或类似的东西来捕捉长按并消费它。

标签: android android-listview onlongclicklistener


【解决方案1】:

您必须在 ListView 中设置 setOnItemLongClickListener()

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos: " + pos);

                return true;
            }
        }); 

列表中每个项目的 XML(如果您使用自定义 XML)也必须有 android:longClickable="true"(或者您可以使用方便的方法 lv.setLongClickable(true);)。这样你就可以得到一个列表,其中只有一些响应 longclick 的项目。

希望这会对你有所帮助。

【讨论】:

  • 请务必同时致电lv.setLongClickable(true);
  • 这对我不起作用。但这确实:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
  • 不知何故 adroid:longClickable="true" 是默认的。我使用的是 API 19。所以我根本不需要指定它。
  • Android 在设置监听器时设置 longClickable=true。
  • long id 中存储了什么值? in public boolean onItemLongClick(AdapterView> arg0, View arg1, int pos, long id
【解决方案2】:

如果您的 ListView row 项目引用一个单独的 XML 文件,除了将 setOnItemLongClickListener() 设置为 ListView 之外,请务必将 android:longClickable="true" 添加到该布局文件。

【讨论】:

  • 谢谢!用这个敲我的头。
【解决方案3】:

或试试这个代码:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {

    Toast.makeText(list.this,myList.getItemAtPosition(index).toString(), Toast.LENGTH_LONG).show();
                return false;
            }
}); 

【讨论】:

    【解决方案4】:

    我认为上面的代码适用于 LongClicking 列表视图,而不是单个项目。

    为什么不使用registerForContextMenu(listView)。然后在 OnCreateContextMenu 中获取回调。

    对于大多数用例,这将是相同的。

    【讨论】:

      【解决方案5】:

      在xml中添加

      <ListView android:longClickable="true">
      

      在java文件中

      lv.setLongClickable(true) 
      

      试试这个 setOnItemLongClickListener()

      lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                  @Override
                  public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l) {
                      //final String category = "Position at : "+pos;
                      final String category = ((TextView) view.findViewById(R.id.textView)).getText().toString();
                      Toast.makeText(getActivity(),""+category,Toast.LENGTH_LONG).show();
                      args = new Bundle();
                      args.putString("category", category);
                      return false;
                  }
              });
      

      【讨论】:

        【解决方案6】:

        这应该可以工作

        ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        
                    @Override
                    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                                   int pos, long id) {
                        // TODO Auto-generated method stub
        
                        Toast.makeText(getContext(), "long clicked, "+"pos: " + pos, Toast.LENGTH_LONG).show();
        
                        return true;
                    }
                });
        

        也不要忘记在您的 xml 中 android:longClickable="true" 或者如果您有自定义视图,请将其添加到您的自定义视图类 youCustomView.setLongClickable(true);

        这是上面代码的输出

        【讨论】:

          【解决方案7】:

          我尝试了大多数这些答案,但对于启用了自动链接但还必须在同一个地方使用长按的 TextView,它们都失败了!

          我创建了一个可以工作的自定义类。

          public class TextViewLinkLongPressUrl extends TextView {
          
              private boolean isLongClick = false;
          
              public TextViewLinkLongPressUrl(Context context) {
                  super(context);
              }
          
              public TextViewLinkLongPressUrl(Context context, AttributeSet attrs) {
                  super(context, attrs);
              }
          
              public TextViewLinkLongPressUrl(Context context, AttributeSet attrs, int defStyleAttr) {
                  super(context, attrs, defStyleAttr);
              }
          
              @Override
              public void setText(CharSequence text, BufferType type) {
                  super.setText(text, type);
              }
          
              @Override
              public boolean onTouchEvent(MotionEvent event) {
          
                  if (event.getAction() == MotionEvent.ACTION_UP && isLongClick) {
                      isLongClick = false;
                      return false;
                  }
          
                  if (event.getAction() == MotionEvent.ACTION_UP) {
                      isLongClick = false;
                  }
          
                  if (event.getAction() == MotionEvent.ACTION_DOWN) {
                      isLongClick = false;
                  }
          
                  return super.onTouchEvent(event);
              }
          
              @Override
              public boolean performLongClick() {
                  isLongClick = true;
                  return super.performLongClick();
              }
          }
          

          【讨论】:

            【解决方案8】:

            这对我来说对 cardView 有效,对于适配器 calss 内的 listview 也一样,在 onBindViewHolder() 函数中

            holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
                        @Override
                        public boolean onLongClick(View v) {
                            return false;
                        }
                    });
            

            【讨论】:

              【解决方案9】:

              如果你想在适配器中这样做,你可以简单地这样做:

              itemView.setOnLongClickListener(new View.OnLongClickListener()
                      {
                          @Override
                          public boolean onLongClick(View v) {
                              Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
                          }
                      });
              

              【讨论】:

                【解决方案10】:
                    listView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View view) {
                        return false;
                    }
                });
                

                绝对可以。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多