Je souhaite ajouter OnLongClickListener
à la liste. Chaque fois que l'utilisateur appuie longuement sur l'élément de la liste, une action doit être effectuée, mais mon code ne capture pas cet écouteur. S'il vous plaît laissez-moi savoir où je vais mal. Le code similaire fonctionne très bien pour setOnItemClickListener
.
Voici le code:
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;
}
});
Vous devez définir setOnItemLongClickListener () dans 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;
}
});
Le XML pour chaque élément de la liste (si vous utilisez un XML personnalisé) doit également avoir Android:longClickable="true"
(ou vous pouvez utiliser la méthode pratique lv.setLongClickable(true);
). De cette façon, vous pouvez avoir une liste avec seulement quelques éléments répondant à longclick.
J'espère que ceci vous aidera.
Si votre élément ListView row fait référence à un fichier XML distinct, veillez à ajouter Android:longClickable="true"
à ce fichier de présentation en plus de définir setOnItemLongClickListener()
sur votre ListView.
ou essayez ce code:
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;
}
});
Je pense que ce code ci-dessus fonctionnera sur LongClicking la listview, pas les éléments individuels.
pourquoi ne pas utiliser registerForContextMenu(listView)
. puis obtenez le rappel dans OnCreateContextMenu.
Dans la plupart des cas d'utilisation, cela fonctionnera de la même manière.
En xml ajouter
<ListView Android:longClickable="true">
En fichier Java
lv.setLongClickable(true)
essayez cette 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;
}
});
cela devrait marcher
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;
}
});
de plus, n'oubliez pas d'ajouter dans votre code XML Android:longClickable="true"
ou si vous avez une vue personnalisée, ajoutez ceci à votre classe de vue personnalisée youCustomView.setLongClickable(true);
J'ai essayé la plupart de ces réponses et elles échouaient toutes pour TextViews qui permettait l'activation de la liaison automatique, mais devait aussi utiliser la presse longue au même endroit!
J'ai créé un cours personnalisé qui fonctionne.
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();
}
}
Cela a fonctionné pour moi pour cardView et fonctionnera de la même manière pour listview à l'intérieur de l'adaptateur, dans la fonction onBindViewHolder()
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
Si vous voulez le faire dans l'adaptateur, vous pouvez simplement faire ceci:
itemView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
}
});