Delete row from RecyclerView

I somehow implemented a rework with this message, now my requirement is to delete a line at runtime from this Backup view.

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

Please help me.

Thank.

+4
source share
5 answers

Since we don’t know how your advertiser is and taking into account the information in this link, you can create a method in the adapter that removes the object:

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

You can do all this from your work, for example:

((MyRecyclerAdapter)myRecyclerView.getAdapter()).removeItem(position);
+8
source

I was able to get it to work like that.

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

.

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

2 , , .

, ?

holder.itemView.setTag(model.get(position)); onBindViewHolder ViewModel model = (ViewModel) v.getTag(); onClick()

RecyclerView :

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

4. interface:

interface RecyclerViewItemClickInterface {

void    onItemclick(View v,ViewModel viewModel);

}
+1

, , , - onClicks ViewHolder. , ViewHolder onCreateViewHolder.

- :

--- ---

Adapter:

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

This works for me. I don’t know if it is possible to improve performance (maybe), but this is the easiest way I found.

Hope this helps.

0
source

I know this is a late answer, but it may be useful to others. You don't need to add new delete method in your adapter class. The best way to do this is first add interfacein your class ViewHolder.

public class ApapterVH extends RecyclerView.ViewHolder implements View.OnClickListener{
    ImageView ivDeleteItem;

    ApapterVH(View itemView) {
        super(itemView);

        ivDeleteItem = itemView.findViewById(R.id.ivDelete);

        itemView.setOnClickListener(this);
        ivDeleteFoodItem.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == ivDeleteItem.getId()){
            onItemClickListener.onDelete(v, getAdapterPosition());
        }
        if(onItemClickListener!=null){
            onItemClickListener.onItemClick(v, getAdapterPosition());
        }
    }
}

public interface OnItemClickListener {
    void onItemClick(View view , int position);
    void onDelete(View view, int position);
}

public void SetOnItemClickListener(final OnItemClickListener onItemClickListener){
    this.onItemClickListener = onItemClickListener;
}

Then in your activity or snippet add the following:

 mAdapter.SetOnItemClickListener(new YourAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            //Do something
        }

        @Override
        public void onDelete(View view, int position) {
            mList.remove(position);
            mAdapter.notifyItemRemoved(position);
        }

    });

Only this two-line code will remove your element:

 mList.remove(position);
 mAdapter.notifyItemRemoved(position);
0
source

All Articles