Android RecyclerView adición y eliminación de artículos

Tengo un RecyclerView con un cuadro de texto TextView y un botón de la cruz ImageView. Tengo un botón fuera de la recyclerview que hace que el botón de la cruz ImageView visible / ido.

Estoy buscando para quitar un elemento de la recylerview, cuando los elementos cruzar botón ImageView se presiona.

Mi adaptador:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener { private ArrayList<String> mDataset; private static Context sContext; public MyAdapter(Context context, ArrayList<String> myDataset) { mDataset = myDataset; sContext = context; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false); ViewHolder holder = new ViewHolder(v); holder.mNameTextView.setOnClickListener(MyAdapter.this); holder.mNameTextView.setOnLongClickListener(MyAdapter.this); holder.mNameTextView.setTag(holder); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mNameTextView.setText(mDataset.get(position)); } @Override public int getItemCount() { return mDataset.size(); } @Override public void onClick(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (view.getId() == holder.mNameTextView.getId()) { Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show(); } } @Override public boolean onLongClick(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (view.getId() == holder.mNameTextView.getId()) { mDataset.remove(holder.getPosition()); notifyDataSetChanged(); Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list", Toast.LENGTH_SHORT).show(); } return false; } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mNumberRowTextView; public TextView mNameTextView; public ViewHolder(View v) { super(v); mNameTextView = (TextView) v.findViewById(R.id.nameTextView); } } } 

Mi diseño es:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:id="@+id/layout"> <TextView android:id="@+id/nameTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:padding="5dp" android:background="@drawable/greyline"/> <ImageView android:id="@+id/crossButton" android:layout_width="16dp" android:layout_height="16dp" android:visibility="gone" android:layout_marginLeft="50dp" android:src="@drawable/cross" /> </LinearLayout> 

¿Cómo puedo obtener algo como un onClick trabajando para mi crossButton ImageView? ¿Hay una mejor manera? ¿Tal vez cambiando el onclick todo del artículo en un quita el artículo? La vista de reciclaje muestra una lista de ubicaciones que necesitan ser editadas. Cualquier asesoramiento técnico o comentarios / sugerencias sobre la mejor implementación sería muy apreciado.

He hecho algo similar. En su MyAdapter :

 public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ public CardView mCardView; public TextView mTextViewTitle; public TextView mTextViewContent; public ImageView mImageViewContentPic; //...... public ImageView imgViewRemoveIcon; public ViewHolder(View v) { super(v); mCardView = (CardView) v.findViewById(R.id.card_view); mTextViewTitle = (TextView) v.findViewById(R.id.item_title); mTextViewContent = (TextView) v.findViewById(R.id.item_content); mImageViewContentPic = (ImageView) v.findViewById(R.id.item_content_pic); //...... imgViewRemoveIcon = (ImageView) v.findViewById(R.id.remove_icon); mTextViewContent.setOnClickListener(this); imgViewRemoveIcon.setOnClickListener(this); v.setOnClickListener(this); mTextViewContent.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (mItemClickListener != null) { mItemClickListener.onItemClick(view, getPosition()); } return false; } }); } @Override public void onClick(View v) { //Log.d("View: ", v.toString()); //Toast.makeText(v.getContext(), mTextViewTitle.getText() + " position = " + getPosition(), Toast.LENGTH_SHORT).show(); if(v.equals(imgViewRemoveIcon)){ removeAt(getPosition()); }else if (mItemClickListener != null) { mItemClickListener.onItemClick(v, getPosition()); } } } public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; } public void removeAt(int position) { mDataset.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDataSet.size()); } 

Espero que esto ayude.

Editar:

getPosition() es depricated ahora usa getAdapterPosition() lugar.

En primer lugar, el elemento debe ser eliminado de la lista!

  mDataSet.remove(getAdapterPosition()); 

entonces:

  notifyItemRemoved(getAdapterPosition()); notifyItemRangeChanged(getAdapterPosition(),mDataSet.size()); 

Si todavía el artículo no quitado utiliza este método mágico 🙂

 private void deleteItem(int position) { mDataSet.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDataSet.size()); holder.itemView.setVisibility(View.GONE); } 

He intentado todas las respuestas anteriores, pero la inserción o eliminación de elementos a recyclerview causa problemas con la posición en el conjunto de datos. Terminó usando delete(getAdapterPosition()); Dentro del viewHolder que funcionó muy bien para encontrar la posición de los elementos.

El problema que tuve fue que estaba eliminando un elemento de la lista que ya no estaba asociado con el adaptador para asegurarse de que está modificando el adaptador correcto que puede implementar un método como este en su adaptador:

 public void removeItemAtPosition(int position) { items.remove(position); } 

Y llámalo en tu fragmento o actividad como esta:

 adapter.removeItemAtPosition(position); 
  • Android recyclerView findViewHolderForAdapterPosition devuelve null
  • ¿Necesito dependencia de Gradle para RecyclerView?
  • RecyclerView - saltar a la posición, luego desplazamiento suave hasta la parte superior
  • RecyclerView y solicitudes de fondo con una gran colección de elementos
  • Cómo agregar consistentemente fondos alternativos a las vistas de elementos en RecyclerView
  • RecyclerVer el número de elementos visibles
  • ¿Cuál es el equivalente de listview.getCount en caso de Recyclerview
  • Cómo hacer Zoom en todo el contenido de RecyclerView?
  • ¿Cómo configurar la altura de recyclerview de forma programática?
  • Cómo deshabilitar el desplazamiento de RecyclerView excepto programáticamente
  • ¿Cómo implementar multi-select en RecyclerView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.