Как реализовать прослушиватель длинного клика в списке
Я хочу добавить 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;
}
});
Ответы
Ответ 1
Вы должны установить 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);
). Таким образом, вы можете иметь список, содержащий только некоторые элементы, отвечающие на longclick.
Надеюсь, это поможет вам.
Ответ 2
Если элемент ListView строка относится к отдельному XML файлу, обязательно добавьте android:longClickable="true"
в этот файл макета в дополнение к настройке setOnItemLongClickListener()
в ListView.
Ответ 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
Я думаю, что приведенный выше код будет работать при длинном щелчке по списку, а не по отдельным элементам.
почему бы не использовать 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
Я попробовал большинство из этих ответов, и они все терпели неудачу в 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();
}
}
Ответ 8
Это сработало для меня в cardView и будет работать так же для просмотра списка внутри адаптера, в функции 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;
}
});
Определенно делает трюк.