Как реализовать прослушиватель длинных кликов в просмотре списка
Я хочу добавить 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;
}
});
8 ответов
Вы должны установить setOnItemLongClickListener() в ListView:
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);
). Таким образом, вы можете получить список только с некоторыми элементами, отвечающими на лонгклик.
Надеюсь, что это поможет вам.
Если ваш элемент строки ListView ссылается на отдельный файл XML, обязательно добавьте android:longClickable="true"
в этот файл макета в дополнение к настройке setOnItemLongClickListener()
к вашему ListView.
Или попробуйте этот код:
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;
}
});
Я думаю, что приведенный выше код будет работать при длинном щелчке по списку, а не по отдельным элементам.
почему бы не использовать registerForContextMenu(listView)
, а затем получить обратный вызов в OnCreateContextMenu.
Для большинства случаев использования это будет работать одинаково.
В 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;
}
});
Я попробовал большинство из этих ответов, и все они терпели неудачу для 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();
}
}
Это должно работать
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);
Это работало для меня для cardView и будет работать так же для просмотра списка внутри адаптера, внутри onBindViewHolder()
функция
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
listView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
return false;
}
});
Определенно делает свое дело.
Если вы хотите сделать это в адаптере, вы можете просто сделать это:
itemView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
}
});