Reputation:
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
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
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
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
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
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 :
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;
}
}
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);
}
}
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
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