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.
- Recyclerview Sin adaptador conectado; Saltar el diseño
- Transición de elemento compartido en RecyclerView
- RecyclerView ItemDecoration Espaciado y Span
- ¿Cómo realizar un seguimiento de los elementos seleccionados en un RecyclerView en Android?
- Java.lang.NullPointerException en android.support.v7.widget.RecyclerView.onMeasure
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.
- Selección única en RecyclerView
- ¿Cuál es el punto de usar decoraciones de artículos en RecyclerView VS edición de los diseños inflados individuales?
- ¿Cómo se relaciona la posición de un adaptador de RecyclerView con el índice de su conjunto de datos?
- Circular RecyclerView
- Error al inflar la clase android.support.v7.widget.RecyclerView
- Recyclerview dentro de la vista de desplazamiento anidada cargando todos los datos en lugar de llamar una por una imagen cuando se desplaza
- Google Play Store como interfaz utilizando la vista de reciclador
- Detectar clic en RecyclerView fuera de los elementos
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);
- Depurar javascript en android emulador con phonegap
- ¿Cómo comprobar si la actividad está en primer plano o en un fondo visible?