如何使用包含标题的recyclerview处理点击

时间:2018-01-18 18:05:12

标签: android arraylist android-recyclerview recycler-adapter

我有一个显示图像的recyclerview。我在这个rec​​yclerview中添加了一个标题,因此每年都会对图片进行分组。要做到这一点,我必须实现一个List。我通过为标题添加年份字符串然后为该年的所有图像构建该列表。这就是看起来像

for (int x = 0; x < sortListYear.size(); x++) {
            mCombinedList.add(sortListYear.get(x));
            for (int i = 0; i < media.size(); i++) {
                if (sdfFrom.format(media.get(i).getDateModified()).equalsIgnoreCase(sortListYear.get(x))){
                    mCombinedList.add(media.get(i));
                }
            }
        }

然后我的其他适配器功能

@Override
    public int getItemViewType(int position) {
        if (mCombinedList.get(position) instanceof String){
            return TypeItem.TYPE_HEAD;
        } else {
            return TypeItem.TYPE_MEDIA;
        }
    }

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TypeItem.TYPE_HEAD) {
            return new HeadHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.header_text, parent, false));
        } else {
            return new MediaHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_photo, parent, false));
        }
    }

@Override
    public void onBindViewHolder(ThemedViewHolder holder, int position) {
        if (holder instanceof HeadHolder) {
            String string = (String) mCombinedList.get(position);
            ((HeadHolder)holder).bindView(string, position);
        } else {
            Media m = (Media) mCombinedList.get(position);
            ((MediaHolder)holder).bindView(m, position);
        }
    }

在我添加标题之前,这就是我将如何获取图像arraylist

public ArrayList<Media> getMedia() {
        return media;
    }

问题是我用包含标题的mCombinedList替换了它。如何在没有标题的情况下获取我的媒体?也不会在适配器中定位是个问题吗?

我还有方法getSelected()和getFirstSelected()。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。如果您只想听取项目点击,一种方法是为点击定义一个监听器。

interface MediaClickListener {
    void onItemClick(Media item);
}

然后在适配器内部,您可以保存对侦听器的引用,以将事件转发到。

private MediaClickListener clickListener;

void setClickListener(MediaClickListener clickListener) {
    this.clickListener = clickListener;
}

接下来,确保您的MediaHolder是适配器的非静态内部类。当您在bindView()上致电MediaHolder时,您应该存储对其当前绑定的Media项的引用。

private Media currentItem;

void bindView(Media media) {
    currentItem = media;
}

最后,在实例化MediaHolder后,添加您的观看次数OnClickListener

MediaHolder(View view) {
    view.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
             if (clickListener != null) clickListener.onItemClick(currentItem);
        } 
    });
}

因为你的持有人是一个非静态的内部类,所以它可以访问周围的适配器clickLister

如果您想跟踪已选择的项目,则可以在适配器中保留List<Media>

private List<Media> selectedItems = new ArrayList<>();

然后在MediaHolder中,您可以在用户与其进行互动时添加/删除该集合中的项目。

view.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        if (selectedItems.contains(currentItem)) selectedItems.remove(currentItem);
        else selectedItems.add(currentItem);
    }
});

这样您就可以检索getSelected()方法中的所有选定项目。