我是使用recyclerview和适配器的新手。我有RecyclerView和Onclick工作(感谢Google:https://github.com/googlesamples/android-RecyclerView)。它有一个写入Log的setOnClickListener。但是我试图弄清楚如何在单击列表时从列表中删除项目 - 我无法弄清楚如何到达适配器正在使用的ArrayList并运行notifyItemInserted来更新显示。
在审核另一篇文章(Android RecyclerView添加和删除项目 - Android RecyclerView addition & removal of items)时,看起来paradite / Jared Burrows能够让它运行起来。但是有些代码似乎缺失了,我希望有人可以为我填补漏洞。 (我无法对另一篇帖子发表评论,在那里提出问题)。
例如,我没有看到mItemClickListener是在任何地方定义的。我也不确定扩展RecyclerView.Adapter的类和扩展RecyclerView.ViewHolder的类之间的连接。
这是我的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());
}
}
我正在尝试使用其他StackOverflow问题中的适配器,但我不确定如何连接(或组合?)两个适配器以及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());
}
这可能是一个微不足道的问题,但我当然会感谢任何人愿意提供的任何帮助......谢谢!
答案 0 :(得分:1)
根据我的理解,您无法确定点击了哪个项目?所以你需要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,这样您就可以访问数组和notify方法。
答案 1 :(得分:-1)
好的,我得到了它的工作。而不是让ViewHolder成为一个&#34;公共静态类&#34;我需要把它做成公共课&#34;。然后我就可以直接从setOnClickListener块修改我的arraylist:
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;
}
}