Android RecyclerView添加和删除项目(Android RecyclerView addition & removal of items)

编程入门 行业动态 更新时间:2024-10-27 04:34:20
Android RecyclerView添加和删除项目(Android RecyclerView addition & removal of items)

我有一个RecyclerView与一个TextView文本框和一个交叉按钮ImageView。 我在回收站外面有一个按钮,使得CrossView的CrossView可见/不见了。

我正在寻找从recylerview删除一个项目,当该项目交叉按钮ImageView被按下。

我的适配器

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工作? 有没有更好的办法? 也许把整个项目改成一个删除项目? 回收站显示需要编辑的位置列表。 任何关于最佳实施的技术意见或意见/建议将受到极大的赞赏。

I have a RecyclerView with an TextView text box and a cross button ImageView. I have a button outside of the recyclerview that makes the cross button ImageView visible / gone.

I'm looking to remove an item from the recylerview, when that items cross button ImageView is pressed.

My adapter:

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

My layout is:

<?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>

How can I get something like an onClick working for my crossButton ImageView? Is there a better way? Maybe changing the whole item onclick into a remove the item? The recyclerview shows a list of locations that need to be edited. Any technical advice or comments / suggestions on best implementation would be hugely appreciated.

最满意答案

我做了类似的事情 在你的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()被取代,现在使用getAdapterPosition() 。

I have done something similar. In your 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()); }

Hope this helps.

Edit:

getPosition() is deprecated now, use getAdapterPosition() instead.

更多推荐

本文发布于:2023-08-05 14:32:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1434752.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:项目   RecyclerView   Android   items   removal

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!