Eliminar fila de RecyclerView

De alguna manera he implementado reciclar vista con la ayuda de este post, ahora mi requisito es eliminar una fila en tiempo de ejecución de esta vista de reciclar.

Link – http://treyrobinson.net/blog/android-l-tutorials-part-3-recyclerview-and-cardview/

Por favor, ayúdame.

Gracias.

4 Solutions collect form web for “Eliminar fila de RecyclerView”

Puesto que no sabemos cómo es su adaptador y dado la información en ese acoplamiento usted puede crear un método en el adaptador que quita un objeto:

public void removeItem(int position) { mData.remove(position); notifyItemRemoved(position); } 

Usted puede todo esto de su actividad como:

 ((MyRecyclerAdapter)myRecyclerView.getAdapter()).removeItem(position); 

Yo era capaz de hacerlo funcionar así.

  ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { //Remove swiped item from list and notify the RecyclerView datalist.remove(viewHolder.getAdapterPosition()); // this line animates what happens after delete adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); Snackbar.make(recyclerView, "delete successful", Snackbar.LENGTH_LONG).show(); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } }; 

Y establecer el anterior a la vista de reciclador como este.

  ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); itemTouchHelper.attachToRecyclerView(recyclerView); 

Yo estaba intentando lo mismo de los últimos 2 días y finalmente conseguí que funcione.

Mi mayor problema fue ¿Cómo obtener la posición de la vista de clic para que podamos eliminarlo del adaptador?

Y la solución fue use holder.itemView.setTag(model.get(position)); onBindViewHolder para almacenar la posición de la vista y obtener la posición de la vista ViewModel model = (ViewModel) v.getTag(); usando ViewModel model = (ViewModel) v.getTag(); En onClick()

Pasos para eliminar la fila de RecyclerView en tiempo de ejecución:

  1. Crear MainActivity.java

     public class MainActivity extends Activity { private RecyclerView recyclerView; private RecyclerView.LayoutManager layoutManager; private String[] liststring; private TypedArray listImages; MyRecyclerView adapter; List<ViewModel> model; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); liststring=getResources().getStringArray(R.array.listString); listImages=getResources().obtainTypedArray(R.array.listImages); recyclerView=(RecyclerView) findViewById(R.id.my_recycler_view); recyclerView.setHasFixedSize(true); layoutManager=new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); adapter=new MyRecyclerView(createMockList(),this); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new RecyclerViewItemClickInterface() { @Override public void onItemclick(View v,ViewModel vModel) { // TODO Auto-generated method stub Log.i("inflatedlayout", v.getId()+""); adapter.remove(vModel); } }); } private List<ViewModel> createMockList() { List<ViewModel> items = new ArrayList<ViewModel>(); for (int i = 0; i < 9; i++) { items.add(new ViewModel("Item " + (i + 1),listImages.getResourceId(i, -1))); } return items; } } 
  2. Crear MyRecyclerView.java

    public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.MyViewHolder> implements View.OnClickListener { String data[]; TypedArray images; MyRecyclerView mv; Activity act_context; RecyclerViewItemClickInterface listener; List<ViewModel> model;

     public MyRecyclerView(List<ViewModel> model,Activity act_context) { // TODO Auto-generated constructor stub this.model=model; this.act_context=act_context; } public static class MyViewHolder extends ViewHolder{ private ImageView imageView1; private TextView textView1; //private IMyViewHolderClicks listener; public MyViewHolder(View inflatedView) { super(inflatedView); // TODO Auto-generated constructor stub textView1=(TextView) inflatedView.findViewById(R.id.textView1); imageView1=(ImageView) inflatedView.findViewById(R.id.imageView1); } } @Override public int getItemViewType(int position) { // TODO Auto-generated method stub Log.i("getIemViewTypePosition", ""+position); return super.getItemViewType(position); } @Override public int getItemCount() { // TODO Auto-generated method stub return model.size(); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { // TODO Auto-generated method stub holder.itemView.setTag(model.get(position)); holder.imageView1.setImageResource(model.get(position).getImage()); holder.textView1.setText(model.get(position).gettest()); Log.i("onBindViewHolder", "called by layoutmanager"); } @Override public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { // TODO Auto-generated method stub View v=LayoutInflater.from(act_context).inflate(R.layout.row_layout, parent, false); v.setOnClickListener(this); MyRecyclerView.MyViewHolder vh = new MyViewHolder(v); Log.i("onCreateViewHolder", "ViewHolder created"); return vh; } @Override public void onClick(View v) { // TODO Auto-generated method stub if (listener != null) { ViewModel model = (ViewModel) v.getTag(); listener.onItemclick(v,model);} } void setOnItemClickListener(RecyclerViewItemClickInterface listener){ this.listener=listener; } public void remove(ViewModel item) { int position = model.indexOf(item); model.remove(position); notifyItemRemoved(position); } } 
  3. Crear ViewModel.java

public class ViewModel {
String test; int image;
public ViewModel(String test,int image) { // TODO Auto-generated constructor stub this.test=test; this.image=image; }
String gettest(){ return test; }
int getImage(){ return image; }}

interface 4.Create:

 interface RecyclerViewItemClickInterface { void onItemclick(View v,ViewModel viewModel); } 

Si desea eliminar una fila haciendo clic en ella, creo que la forma más limpia de hacerlo es mediante la implementación de los onClicks en el ViewHolder. A continuación, implementar un método de eliminación pública en el adaptador y, a continuación, pasar el adaptador a la ViewHolder a través del método onCreateViewHolder.

Sería algo como esto:

—EJEMPLO—

Adaptador:

 public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<Object> mDataset; // This is the list of items to be shown //Here you would write the rest of your Adapter code public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View itemView = mInflater.inflate(R.layout.item_recyclerview_round, parent, false); return new RoundViewHolder(itemView, this); } public void removeItem(int position) { mDataSet.remove(position); notifyItemRemoved(position); // Add whatever you want to do when removing an Item } } 

ViewHolder:

 public class MyViewHolder RecyclerView.ViewHolder implements View.OnClickListener { private MyAdapter myAdapter; // Here you would write the rest of your ViewHolder code public MyViewHolder (View itemView, MyAdapter myAdapter){ super(itemView); this.myAdapter = myAdapter; // Here you would write the rest of your constructor } public void onClick(View view) { myAdapter.removeItem(getAdapterPosition()); } 

Esto funciona para mi. No sé si el rendimiento se podría mejorar (probablemente), pero es la forma más simple que encontré.

Espero que ayude.

  • Estilo de RecyclerView a nivel de tema
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • ScrollBy no funciona correctamente en recyclerview anidado
  • Desplazar RecyclerView para mostrar el elemento seleccionado en la parte superior
  • Cómo manejar un montón de diferentes tipos de vista en el visor de recyclerview
  • Botón de acción flotante en una actividad - ¿cómo anclar a una vista de reciclaje en un fragmento?
  • Android RecyclerView último elemento eliminar (tiempo de ejecución) error
  • La barra de herramientas no se contrae con RecyclerView anidado
  • Cómo permanecer en una posición de desplazamiento en RecyclerView después de añadir elementos en su primer índice y llamar a notificydatasetchange
  • Visualización de imágenes de almacenamiento en base a firebase en un RecyclerView
  • Pantalla Android Parpadea en mostrar / ocultar barras del sistema
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.