Android RecyclerView添加和删除项目

我有一个TextView文本框和十字buttonImageView RecyclerView。 我有一个回收站的button之外的button,使交叉buttonImageView可见/消失。

我正在从recylerview中删除一个项目,当该项目交叉buttonImageView被按下。

我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener { private ArrayList<String> mDataset; private static Context sContext; public MyAdapter(Context context, ArrayList<String> myDataset) { mDataset = myDataset; sContext = context; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false); ViewHolder holder = new ViewHolder(v); holder.mNameTextView.setOnClickListener(MyAdapter.this); holder.mNameTextView.setOnLongClickListener(MyAdapter.this); holder.mNameTextView.setTag(holder); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mNameTextView.setText(mDataset.get(position)); } @Override public int getItemCount() { return mDataset.size(); } @Override public void onClick(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (view.getId() == holder.mNameTextView.getId()) { Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show(); } } @Override public boolean onLongClick(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (view.getId() == holder.mNameTextView.getId()) { mDataset.remove(holder.getPosition()); notifyDataSetChanged(); Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list", Toast.LENGTH_SHORT).show(); } return false; } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mNumberRowTextView; public TextView mNameTextView; public ViewHolder(View v) { super(v); mNameTextView = (TextView) v.findViewById(R.id.nameTextView); } } } 

我的布局是:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:id="@+id/layout"> <TextView android:id="@+id/nameTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:padding="5dp" android:background="@drawable/greyline"/> <ImageView android:id="@+id/crossButton" android:layout_width="16dp" android:layout_height="16dp" android:visibility="gone" android:layout_marginLeft="50dp" android:src="@drawable/cross" /> </LinearLayout> 

我怎么能得到像我的crossButton ImageView的onClick工作? 有没有更好的办法? 也许改变整个项目onclick到删除项目? recyclerview显示需要编辑的位置列表。 任何有关最佳实施的技术build议或意见/build议将受到极大的赞赏。

我做了类似的事情。 在你的MyAdapter

 public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ public CardView mCardView; public TextView mTextViewTitle; public TextView mTextViewContent; public ImageView mImageViewContentPic; //...... public ImageView imgViewRemoveIcon; public ViewHolder(View v) { super(v); mCardView = (CardView) v.findViewById(R.id.card_view); mTextViewTitle = (TextView) v.findViewById(R.id.item_title); mTextViewContent = (TextView) v.findViewById(R.id.item_content); mImageViewContentPic = (ImageView) v.findViewById(R.id.item_content_pic); //...... imgViewRemoveIcon = (ImageView) v.findViewById(R.id.remove_icon); mTextViewContent.setOnClickListener(this); imgViewRemoveIcon.setOnClickListener(this); v.setOnClickListener(this); mTextViewContent.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (mItemClickListener != null) { mItemClickListener.onItemClick(view, getPosition()); } return false; } }); } @Override public void onClick(View v) { //Log.d("View: ", v.toString()); //Toast.makeText(v.getContext(), mTextViewTitle.getText() + " position = " + getPosition(), Toast.LENGTH_SHORT).show(); if(v.equals(imgViewRemoveIcon)){ removeAt(getPosition()); }else if (mItemClickListener != null) { mItemClickListener.onItemClick(v, getPosition()); } } } public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; } public void removeAt(int position) { mDataset.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDataSet.size()); } 

希望这可以帮助。

编辑:

getPosition()被depricated现在使用getAdapterPosition()来代替。

首先,项目应该从名单中删除!

  mDataSet.remove(getAdapterPosition()); 

然后:

  notifyItemRemoved(getAdapterPosition()); notifyItemRangeChanged(getAdapterPosition(),mDataSet.size()); 

如果还没有删除项目使用这个神奇的方法:)

 private void deleteItem(int position) { mDataSet.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDataSet.size()); holder.itemView.setVisibility(View.GONE); } 

我尝试了所有上述的答案,但插入或删除items到recyclerview会导致数据集中的位置问题。 结束使用delete(getAdapterPosition()); 在查找物品的位置非常有效的viewHolder里面。

我遇到的问题是我从列表中删除了一个不再与该适配器相关联的项目,以确保您正在修改正确的适配器,您可以在适配器中实现像这样的方法:

 public void removeItemAtPosition(int position) { items.remove(position); } 

并把它称为你的片段或活动,如下所示:

 adapter.removeItemAtPosition(position); 

可能是一个重复的答案,但对我来说非常有用。 您可以在RecyclerView.Adapter<RecyclerView.ViewHolder>实现下面给出的方法,并可以根据您的要求使用此方法,我希望它能为您工作

 public void removeItem(@NonNull Object object) { mDataSetList.remove(object); notifyDataSetChanged(); } 
  Bitmap bitmap = arrayList.get(position); arrayList.remove(bitmap); CameraPicloadAdapter.this.notifyDataSetChanged(); 

如果你想删除项目,你应该这样做:首先删除项目:

 phones.remove(position); 

在下一步中,您应该通知您的回收站适配器,您通过以下代码删除项目:

 notifyItemRemoved(position); notifyItemRangeChanged(position, phones.size()); 

但是如果你改变一个项目的话:首先改变你的对象的一个​​参数,像这样:

 Service s = services.get(position); s.done = "Cancel service"; services.set(position,s); 

或者像这样新build:

 Service s = new Service(); services.set(position,s); 

然后通知您的回收站适配器您通过以下代码修改了一个项目:

 notifyItemChanged(position); notifyItemRangeChanged(position, services.size()); 

希望能帮助你。