我有一个显示图像的recyclerview。我在这个recyclerview中添加了一个标题,因此每年都会对图片进行分组。要做到这一点,我必须实现一个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()。
答案 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()
方法中的所有选定项目。