tutorial recyclerview desplegable create context android android-recyclerview contextmenu

android - desplegable - recyclerview context menu tutorial



Android: haz clic largo en el elemento RecyclerView y ContextMenu (2)

Problema: no se puede mostrar un menú contextual que muestre una opción "eliminar" cuando se hace clic largo en un elemento dentro de una vista de reciclador

Resultado esperado: ver imagen a continuación

Casi estoy allí, pero me falta algo para que el menú contextual aparezca en un longClick.

Esto es lo que puse en el viewHolder. No sé qué debería agregar y dónde mostrar el menú contextual en el evento onLongClick.

Me salté algunas líneas de código y guardé las relevantes para mi pregunta.

Muchas gracias por su ayuda,

Mi interfaz para manejar ambos tipos de clics

public interface OnItemClickListener{ void onItemClick(int position); } public interface OnItemLongClickListener{ void onItemLongClick(int position); }

Código del espectador

public void bindLongClick(final int position, final OnItemLongClickListener onItemLongClickListener) { itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { onItemLongClickListener.onItemLongClick(position); return true; } }); } @Override public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo){ //menuInfo is null Log.v(LOG_TAG, "grrr"); contextMenu.setHeaderTitle("Select The Action"); contextMenu.add(0, view.getId(), 0, "Supprimer");//groupId, itemId, order, title }

Código de adaptador

@Override public void onBindViewHolder(CityListViewholder holder, int position) { holder.cityName.setText(cityArrayList.get(position).getCityName()); holder.bindClick(position, onItemClickListener); holder.bindLongClick(position, onItemLongClickListener); }

Luego, en la actividad, salté lo que no es relevante para mi pregunta

mCityListAdapter = new CityListAdapter(mContext, cityArrayList, new CityListAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { mPager.setCurrentItem(position); mDrawerLayout.closeDrawers(); } }, new CityListAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(int position) { Log.v(LOG_TAG, "Position "+position); } }); registerForContextMenu(mRecyclerView);


Edición 1: Para mostrar el diálogo específicamente, use

openContextMenu(v);

donde v se refiere a la Vista. y

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu,menu); } @Override public boolean onContextItemSelected(MenuItem item) { int id = item.getItemId(); default: return super.onContextItemSelected(item); } }

El código en el archivo context_menu en la carpeta de menú debería verse así:

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.MainActivity"> <item android:id="@+id/item" android:orderInCategory="200" android:title="Item" android:icon="@drawable/faq" app:showAsAction="ifRoom" ></item> </menu>

En el pasado, yo también tenía algunos problemas con onClickListener de RecyclerView y onLongClickListener . Así que aquí está el que estoy usando:

public class ItemClickSupport { private final RecyclerView mRecyclerView; private OnItemClickListener mOnItemClickListener; private OnItemLongClickListener mOnItemLongClickListener; private View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v); } } }; private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (mOnItemLongClickListener != null) { RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v); } return false; } }; private RecyclerView.OnChildAttachStateChangeListener mAttachListener = new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(View view) { if (mOnItemClickListener != null) { view.setOnClickListener(mOnClickListener); } if (mOnItemLongClickListener != null) { view.setOnLongClickListener(mOnLongClickListener); } } @Override public void onChildViewDetachedFromWindow(View view) { } }; private ItemClickSupport(RecyclerView recyclerView) { mRecyclerView = recyclerView; mRecyclerView.setTag(R.id.item_click_support, this); mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener); } public static ItemClickSupport addTo(RecyclerView view) { ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); if (support == null) { support = new ItemClickSupport(view); } return support; } public static ItemClickSupport removeFrom(RecyclerView view) { ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); if (support != null) { support.detach(view); } return support; } public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; return this; } public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) { mOnItemLongClickListener = listener; return this; } private void detach(RecyclerView view) { view.removeOnChildAttachStateChangeListener(mAttachListener); view.setTag(R.id.item_click_support, null); } public interface OnItemClickListener { void onItemClicked(RecyclerView recyclerView, int position, View v); } public interface OnItemLongClickListener { boolean onItemLongClicked(RecyclerView recyclerView, int position, View v); } }

y luego en la actividad, use lo siguiente:

ItemClickSupport.addTo(recyclerView).setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() { @Override public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) { return true; } });

Use la position para especificar el artículo. ¡Espero eso ayude!


Lo que necesita allí es mostrar el diálogo con la lista dentro. Como eso:

itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { final CharSequence[] items = {"Supprimer", "etc", "etc1"}; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("Select The Action"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { } }); builder.show(); return true; } });