我想在列表视图中添加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;
}
});
答案 0 :(得分:302)
您必须在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。
希望这会对你有所帮助。
答案 1 :(得分:22)
如果您的ListView 行项引用单独的XML文件,除了将android:longClickable="true"
设置为ListView之外,请务必将setOnItemLongClickListener()
添加到该布局文件。
答案 2 :(得分: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;
}
});
答案 3 :(得分:6)
我认为以上代码适用于LongClicking列表视图,而不是单个项目。
为什么不使用registerForContextMenu(listView)
。然后在OnCreateContextMenu中获取回调。
对于大多数用例,这将是相同的。
答案 4 :(得分: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;
}
});
答案 5 :(得分: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);
答案 6 :(得分:1)
我尝试了大部分这些答案,但是对于启用了自动链接但又必须在同一个地方长按的TextViews,它们都失败了!
我制作了一个有效的自定义课程。
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();
}
}
答案 7 :(得分:0)
这对我来说对cardView来说是有效的,并且在onBindViewHolder()
函数内,在适配器cals中的listview上也一样。
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
答案 8 :(得分:0)
如果要在适配器中执行此操作,只需执行以下操作:
itemView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
}
});
答案 9 :(得分:0)
listView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
return false;
}
});
绝对可以。