问题
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.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);
}
回答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