Ich habe einen Adapter, der ein recyclerView
paßt und ich möchte auf langen Click-Ereignisse auf recyclerView
‚s Elementen ein Popup-Menü öffnen. Wie kann ich das tun?Griff zum Produkt klicken lange auf Recycler Ansicht
Antwort
Zuerst müssen Sie Ihre Aktivität registrieren longClick Ereignisse aus dem recyclerView
(so dass Sie nicht verwenden, um jede Art von onLongClickListener
...) zu hören:
registerForContextMenu(recyclerView);
Dann erstellen Sie eine Menüressource (context_menu.xml):
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Mostra documento" android:id="@+id/context_menu_documents_fragment_view"></item>
<item android:title="Aggiungi ad un contenitore" android:id="@+id/context_menu_documents_fragment_add_to_box"></item>
<item android:title="Elimina documento" android:id="@+id/context_menu_documents_fragment_delete"></item>
</menu>
In der Aktivität in dem Sie Kontextmenü registriert für Sie diese Methoden überschreiben:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Inflate Menu from xml resource
MenuInflater menuInflater = getActivity().getMenuInflater();
menuInflater.inflate(R.menu.context_menu_documents_fragment, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
Toast.makeText(getActivity(), " User selected something ", Toast.LENGTH_LONG).show();
return false;
}
Das ist sehr wichtig, haben Sie den Code in Ihre RecyclerView
Adapter wie folgt zu ändern:
@Override
public void onBindViewHolder(final DocumentViewHolder viewHolder, int position) {
...
viewHolder.itemView.setLongClickable(true);
...
}
Jetzt können Sie sind! Aber Sie sind nicht in der Lage zu wissen, welche Artikel der Benutzer geklickt hat, dies zu tun, Sie eine benutzerdefinierte RecyclerView wie diese verwenden (Original-Code von Renaud Cerrato):
public class ContextMenuRecyclerView extends RecyclerView {
private RecyclerContextMenuInfo mContextMenuInfo;
public ContextMenuRecyclerView(Context context) {
super(context);
}
public ContextMenuRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ContextMenuRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
return mContextMenuInfo;
}
@Override
public boolean showContextMenuForChild(View originalView) {
final int longPressPosition = getChildAdapterPosition(originalView);
if (longPressPosition >= 0) {
final long longPressId = getAdapter().getItemId(longPressPosition);
mContextMenuInfo = new RecyclerContextMenuInfo(longPressPosition, longPressId);
return super.showContextMenuForChild(originalView);
}
return false;
}
public static class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo {
public RecyclerContextMenuInfo(int position, long id) {
this.position = position;
this.id = id;
}
final public int position;
final public long id;
}
}
Im vorherigen onContextItemSelected()
Methode Sie wissen können, die recyclerView
Artikel-ID und die Position mit diesem Code:
ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView.RecyclerContextMenuInfo) item.getMenuInfo();
Schließlich müssen Sie das GetItemID() -Methode in Ihrem recyclerView Adapter und die Layout-Datei, um sicherzustellen, ändern, dass Sie Ihre recyclerView und nicht die android eines verwenden!
Dies wurde bereits beantwortet here. Wie auch immer, man kann es wie folgt tun:
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
private Article article;
private TextView nameTextView;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
nameTextView = (TextView) itemView.findViewById(R.id.grid_item_article_name_textView);
}
public void bind(Article article) {
this.article = article;
nameTextView.setText(article.getName());
}
@Override
public void onClick(View view) {
// Context context = view.getContext();
// article.getName()
}
@Override
public boolean onLongClick(View view) {
// Handle long click
// Return true to indicate the click was handled
return true;
}
}
ich schwer zu kämpfen hatte, die Position von Punkt auf Klick zu holen, das ist für mich gearbeitet:
public void onClick(View view) {
ViewHolder holder =(ViewHolder)view.getTag();
int position = holder.getLayoutPosition();
Log.d("testing ","pos" +position);
}
int position = getAdapterPosition() wird Rückkehrposition von angeklickt i tem. –
ich auf diese Weise tat:
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
ViewHolder(View v) {
super(v);
tvName = (TextView) v.findViewById(R.id.textView_Username);
//Single Tapup
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
});
//Long Press
v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
return false;
}
});
}
}
möglich Duplikat von [Wie erstellt man Kontextmenü für RecyclerView] (http://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview) –