OnClick 从适配器中删除项目的问题
Problems with OnClick to remove item from within Adapter
我不熟悉使用 recyclerview 和适配器。我有 RecyclerView 和 Onclick 工作(感谢 Google: https://github.com/googlesamples/android-RecyclerView)。它确实有一个写入日志的 setOnClickListener。但是我想弄清楚如何在单击项目时从列表中删除它 - 我无法弄清楚如何到达适配器正在使用的 ArrayList 和 运行 notifyItemInserted 来更新显示。
在审查另一个 post(Android RecyclerView 添加和删除项目 - Android RecyclerView addition & removal of items)看起来 paradite/Jared Burrows 能够得到它 运行宁。但是有些代码似乎丢失了,我希望有人能帮我填补这些漏洞。 (我无法评论其他 post 在那里问问题)。
例如,我没有看到任何地方定义了 mItemClickListener。我也不确定扩展 RecyclerView.Adapter 的 class 和扩展 RecyclerView.ViewHolder.
的 class 之间的联系
这是我的 RecyclerView.Adapter:
public class RVAdapter1 extends RecyclerView.Adapter<RVAdapter1.ViewHolder> {
private static final String TAG = "debug";
private int itemCounter = 0;
private List<String> feedItemList;
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
//feedItemList.remove(getPosition());
//notifyItemRemoved(getPosition());
}
});
textView = (TextView) v.findViewById(R.id.textView);
}
public TextView getTextView() {
return textView;
}
}
public RVAdapter1(List<String> dataSet) {
feedItemList = dataSet;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.text_row_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
Log.d(TAG, "Element " + position + " set.");
viewHolder.getTextView().setText(String.valueOf(feedItemList.get(position)));
}
@Override
public int getItemCount() {
return feedItemList.size();
}
public void addItem(int position, String data) {
feedItemList.add(position, data);
notifyItemInserted(position);
Log.d(TAG,"adapter list length=" + feedItemList.size());
}
}
我正在尝试使用来自其他 Whosebug 问题的适配器,但我不确定如何连接(或组合?)这两个适配器以及 mItemClickListener 来自何处。
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(getPosition, mDataSet.size());
}
这可能是一个微不足道的问题,但我当然会感谢任何人愿意提供的任何帮助...谢谢!
据我了解,您无法确定点击了哪个项目?所以你需要 getPosition() 方法。
我的建议是使用视图的 setTag() 方法,其中标签将是提要项在列表中的位置。它应该看起来像这样:
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
Log.d(TAG, "Element " + position + " set.");
viewHolder.getTextView()
.setText(String.valueOf(feedItemList.get(position)));
viewHolder.getRemoveIcon().setTag(position);
}
在此之后像这样创建一个 onClickListener:
@Override
public void onClick(View v) {
int position = (Integer)v.getTag();
feedItemList.remove(position);
notifyItemRemoved(position);
}
为此,您可以让适配器扩展 View.OnClickListener,这样您就可以访问数组和通知方法。
好的,我让它工作了。我不需要让 ViewHolder 成为 "public static class",而是只需要 "public class"。然后我可以直接从 setOnClickListener 块修改我的数组列表:
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
feedItemList.remove(getPosition());
notifyItemRemoved(getPosition());
}
});
textView = (TextView) v.findViewById(R.id.textView);
}
public TextView getTextView() {
return textView;
}
}
我不熟悉使用 recyclerview 和适配器。我有 RecyclerView 和 Onclick 工作(感谢 Google: https://github.com/googlesamples/android-RecyclerView)。它确实有一个写入日志的 setOnClickListener。但是我想弄清楚如何在单击项目时从列表中删除它 - 我无法弄清楚如何到达适配器正在使用的 ArrayList 和 运行 notifyItemInserted 来更新显示。
在审查另一个 post(Android RecyclerView 添加和删除项目 - Android RecyclerView addition & removal of items)看起来 paradite/Jared Burrows 能够得到它 运行宁。但是有些代码似乎丢失了,我希望有人能帮我填补这些漏洞。 (我无法评论其他 post 在那里问问题)。
例如,我没有看到任何地方定义了 mItemClickListener。我也不确定扩展 RecyclerView.Adapter 的 class 和扩展 RecyclerView.ViewHolder.
的 class 之间的联系这是我的 RecyclerView.Adapter:
public class RVAdapter1 extends RecyclerView.Adapter<RVAdapter1.ViewHolder> {
private static final String TAG = "debug";
private int itemCounter = 0;
private List<String> feedItemList;
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
//feedItemList.remove(getPosition());
//notifyItemRemoved(getPosition());
}
});
textView = (TextView) v.findViewById(R.id.textView);
}
public TextView getTextView() {
return textView;
}
}
public RVAdapter1(List<String> dataSet) {
feedItemList = dataSet;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.text_row_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
Log.d(TAG, "Element " + position + " set.");
viewHolder.getTextView().setText(String.valueOf(feedItemList.get(position)));
}
@Override
public int getItemCount() {
return feedItemList.size();
}
public void addItem(int position, String data) {
feedItemList.add(position, data);
notifyItemInserted(position);
Log.d(TAG,"adapter list length=" + feedItemList.size());
}
}
我正在尝试使用来自其他 Whosebug 问题的适配器,但我不确定如何连接(或组合?)这两个适配器以及 mItemClickListener 来自何处。
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(getPosition, mDataSet.size());
}
这可能是一个微不足道的问题,但我当然会感谢任何人愿意提供的任何帮助...谢谢!
据我了解,您无法确定点击了哪个项目?所以你需要 getPosition() 方法。
我的建议是使用视图的 setTag() 方法,其中标签将是提要项在列表中的位置。它应该看起来像这样:
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
Log.d(TAG, "Element " + position + " set.");
viewHolder.getTextView()
.setText(String.valueOf(feedItemList.get(position)));
viewHolder.getRemoveIcon().setTag(position);
}
在此之后像这样创建一个 onClickListener:
@Override
public void onClick(View v) {
int position = (Integer)v.getTag();
feedItemList.remove(position);
notifyItemRemoved(position);
}
为此,您可以让适配器扩展 View.OnClickListener,这样您就可以访问数组和通知方法。
好的,我让它工作了。我不需要让 ViewHolder 成为 "public static class",而是只需要 "public class"。然后我可以直接从 setOnClickListener 块修改我的数组列表:
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
feedItemList.remove(getPosition());
notifyItemRemoved(getPosition());
}
});
textView = (TextView) v.findViewById(R.id.textView);
}
public TextView getTextView() {
return textView;
}
}