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