reciclaje programas oportunidades negocio las estadisticas empresas colombia cifras bogota basuras android android-recyclerview onlongclicklistener

android - programas - reciclaje en colombia cifras



Manejar en el elemento largo clic en la vista de reciclador (4)

Tengo un adaptador que personaliza un recyclerView y quiero abrir un menú emergente en el evento de clic largo en los elementos de recyclerView . ¿Cómo puedo hacer esto?


Estaba luchando duro para obtener la posición del elemento al hacer clic, esto funcionó para mí:

public void onClick(View view) { ViewHolder holder =(ViewHolder)view.getTag(); int position = holder.getLayoutPosition(); Log.d("testing ","pos" +position); }


Esto ya ha sido respondido here . De todos modos, puedes hacerlo así:

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; } }


Lo hice de esta manera:

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; } }); } }


Primero, debe registrar su Actividad para escuchar los eventos longClick del recyclerView (para que no tenga que usar ningún tipo de onLongClickListener ...):

registerForContextMenu(recyclerView);

Luego creas un recurso de menú (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>

En la actividad donde te registraste en el menú contextual, anulas estos métodos:

@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; }

Esto es muy importante, tiene que modificar el código en su adaptador RecyclerView esta manera:

@Override public void onBindViewHolder(final DocumentViewHolder viewHolder, int position) { ... viewHolder.itemView.setLongClickable(true); ... }

¡Ahora puede mostrar el menú contextual e interceptar la selección de usuarios! Pero no puede saber en qué elemento hizo clic el usuario, para hacer esto tiene que usar un RecyclerView personalizado como este (código original de 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; } }

En el método onContextItemSelected() anterior, puede conocer el id y la posición del elemento recyclerView usando este código:

ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView.RecyclerContextMenuInfo) item.getMenuInfo();

Finalmente, debe modificar el método getItemId () en su adaptador recyclerView y el archivo de diseño para asegurarse de que utiliza recyclerView y no el de Android.