как осуществить длинное нажатие слушателя на элемент ListView
Я хочу добавить 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;
}
});
7 ответов:
вы должны установить 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 row элемент относится к отдельному 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; } });
Я думаю, что этот код выше будет работать на LongClicking listview, а не отдельные элементы.
почему бы не использовать
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; } });
это должно работать
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);
я попробовал большинство из этих ответов, и все они были неудачными для 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(); } }