OnClick从Adapter中删除项目的问题

时间:2015-01-17 21:42:34

标签: android adapter android-recyclerview

我是使用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());
}    

这可能是一个微不足道的问题,但我当然会感谢任何人愿意提供的任何帮助......谢谢!

2 个答案:

答案 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;
    }
}
相关问题