user4201839
user4201839

Reputation:

Remove row from RecyclerView

I have somehow implemented recycle view with the help of this post, now my requirement is to remove a row at runtime from this Recycle View.

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

Please help me.

Thanks.

Upvotes: 7

Views: 25084

Answers (6)

Kishan Solanki
Kishan Solanki

Reputation: 14618

If above solutions didn't work then try this,

private fun removeItem(position: Int) {
    items.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, itemCount - position)
}

Upvotes: 0

Yeahia Md Arif
Yeahia Md Arif

Reputation: 7916

I know it's late answer but maybe it will be helpful for others. You don't need to add new delete method in your adapter class. Best way to do this, first add interface in your ViewHolder class.

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 Fragment add this:

 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 delete your item :

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

Upvotes: 0

Daniel Reina
Daniel Reina

Reputation: 6347

If you want to remove a row by clicking on it, I think the cleaner way to do it is by implementing the onClicks at the ViewHolder. Then you implement a public remove method on the adapter, and then pass the adapter to the ViewHolder through the onCreateViewHolder method.

Would be something like this:

---EXAMPLE---

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

It works for me. I don't know if the performance could be improved (probably), but it is the simplest way I found.

I hope it helps.

Upvotes: 2

Aniruddha K.M
Aniruddha K.M

Reputation: 7511

I was able to make it work like this.

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

and set the above to the recycler view like this.

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

Upvotes: 5

Piyush Kukadiya
Piyush Kukadiya

Reputation: 1890

I was trying the same thing from last 2 days and finally got it work.

My major problem was How to get position of clicked view so that we can remove it from adapter ?

and solution was use holder.itemView.setTag(model.get(position)); in onBindViewHolder to store position of view and get the clicked view's position by using ViewModel model = (ViewModel) v.getTag(); in onClick()

Steps to remove row from RecyclerView at runtime :

  1. Create 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. 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);
        }
    
    }    
    
  3. Create 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.Create interface :

interface RecyclerViewItemClickInterface {

void    onItemclick(View v,ViewModel viewModel);

}

Upvotes: 1

Pedro Oliveira
Pedro Oliveira

Reputation: 20500

Since we don't know how is your adaper and given the info in that link you can create a method in the adapter that removes an object:

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

You can all this from your activity like:

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

Upvotes: 12

Related Questions