问题
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.
回答1:
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);
回答2:
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);
回答3:
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.javapublic 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.javapublic 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);
}
回答4:
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.
回答5:
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);
来源:https://stackoverflow.com/questions/26673444/remove-row-from-recyclerview