如何在ListView上实现长按监听器

159

我想在列表视图上添加 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"? - barry
在 XML 中查看长按是否启用? - Connecting life with Android
也许你有一个手势监听器或类似的东西正在捕获长按事件并消耗它。 - Jon Zangitu
10个回答

334
你需要在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);)。这样,您就可以拥有一个仅对某些项目响应长按的列表。

希望这能对您有所帮助。


25
请务必调用lv.setLongClickable(true); - Chris Lacy
15
这个对我没用,但这样做可以:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {... - Luis A. Florit
在某种程度上,adroid:longClickable="true" 是默认的。我正在使用API 19,所以根本不需要指定它。 - user1592714
2
当设置监听器时,Android会将longClickable设置为true。 - Steven Spungin
在公共布尔onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id)中,long id存储了什么值? - Femn Dharamshi

28

如果您的ListView 项目涉及到单独的XML文件,请确保除了将setOnItemLongClickListener()设置为您的ListView之外,还要在该布局文件中添加android:longClickable="true"


谢谢!这个问题让我头疼了好久。 - Shaihi
那是真的...但是关于背景选定的颜色,我们也需要编写代码吗...@Jonathan? - gumuruh

15

或者尝试以下代码:

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

6
我认为上述代码将在长按ListView时起作用,而不是单个项目。
为什么不使用{{link1:registerForContextMenu(listView)}},然后在OnCreateContextMenu中获取回调。
对于大多数用例,这将起到相同的作用。

2
在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;
            }
        });

1
这应该可以工作。
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); 以启用长按功能。

以下是上述代码的输出结果: enter image description here


1
我尝试了大多数答案,但对于启用自动链接但还必须在同一位置使用长按的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();
    }
}

0

这对我在cardView上起作用,对于adapter类中的listview也将起同样的作用,在onBindViewHolder()函数内部实现

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

0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

绝对能解决问题。


0
如果你想在适配器中实现它,可以简单地这样做:
itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接