リストビューに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;
}
});
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);
を使用できます)。このようにして、ロングクリックに反応するいくつかの項目だけを含むリストを持つことができます。
これがお役に立てば幸いです。
ListView row項目が別のXMLファイルを参照している場合は、ListViewにsetOnItemLongClickListener()
を設定することに加えて、必ずそのレイアウトファイルにAndroid:longClickable="true"
を追加してください。
またはこのコードを試してください:
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で機能すると思います。
なぜ 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();
}
}
これは私のためにcardViewのために働きましたそしてonBindViewHolder()
関数の中で、アダプタcalssの中のlistviewのために同じように働くでしょう
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
あなたがアダプタでそれをやりたいならば、あなたは単にこれをすることができます:
itemView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
}
});