如何在列表视图上实现长按监听器


148

我要添加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”?
巴里2012年

在xml中看到是否启用了长按?
使用Android连接生活

也许您有一个Gesture Listener或类似的东西正在捕获长按并使用它。
乔恩·赞古图

Answers:


316

您必须在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。

希望这会帮助你。


25
请务必也致电lv.setLongClickable(true);
克里斯·莱西

15
这对我不起作用。但这确实是:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

以某种方式adroid:longClickable =“ true”是默认设置。我正在使用API​​19。因此,我根本不需要指定它。
user1592714 2013年

2
设置侦听器时,Android设置longClickable = true。
史蒂芬·斯潘金

long id中存储了什么值?在公共布尔onItemLongClick(AdapterView <?> arg0,View arg1,int pos,long id
Femn Dharamshi 18'July

26

如果您的ListView 项目引用一个单独的XML文件,android:longClickable="true"除了设置setOnItemLongClickListener()到ListView 之外,还要确保添加到该布局文件。


谢谢!正在用这个敲我的头。
Shaihi 2013年

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

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

为什么不使用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);

这是上面代码的输出 在此处输入图片说明


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来说对我有用,对于在onBindViewHolder()功能内的适配器cals中的listview也一样

holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                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();
            }
        });

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

绝对可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.