我在recyclerview中创建多个视图持有者没有问题。问题我正在确定标题和项目的定位。
我正在创建一个图库应用,我希望将我的相册名称作为标题,并为每张专辑添加8张图片。所以你会有一个带有专辑标题的标题,然后是该专辑的8张图片。然后是包含专辑标题的下一个标题和该专辑的8张图片。并继续该计划。如果少于8张图片,我想留空,直到下一个标题开始。
我有两个ArrayList我从中获取数据。专辑和媒体。
我正在尝试在我的适配器的getItemViewType中设置类型,但无法像上面提到的那样弄清楚如何设置它们。令我困惑的是,我试图为每张专辑设置多个arraylist和未知数量的图片。
同样,这不是我所看到的关于在recyclerview中设置多个视图持有者的许多问题。我有这个概念。我的问题是确定视图持有者的定位。
这是我的创建和绑定视图看起来如何给出一些上下文
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ALBUM_TYPE) {
return new AlbumHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view, parent, false));
} else if (viewType == HEAD_TYPE) {
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(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof AlbumHolder) {
Album m = albums.get(position);
((AlbumHolder)holder).bindView(m, position);
} else if (holder instanceof HeadHolder) {
if (sortingMode == SortingMode.FOLDER) {
Album m = albums.get(position);
((HeadHolder)holder).bindView(m.getName(), position);
} else {
String m = sortListYear.get(position);
((HeadHolder)holder).bindView(m, position);
}
} else {
Media m = media.get(position);
((MediaHolder)holder).bindView(m, position);
}
}
ALBUM_TYPE不用于我提出的这个问题。只是HEAD_TYPE和MEDIA_TYPE。
答案 0 :(得分:0)
在Media Media和Head
中考虑2个对象您可以做的是创建另一个ArrayList并按顺序在此新的arraylist(Object)中添加数据(Media或Head),以便在recyclerview中显示/使用它。
ArrayList<Object> objList = new ArrayList<>();
objList.add(new Head("Header1");
objList.add(new Media("/img1"));
objList.add(new Media("/img2"));
objList.add(new Media());//no image, for blank entry
objList.add(new Head("Header2"));
objList.add(new Media("/img3"));
objList.add(new Media());
objList.add(new Media());
现在您可以在getItemViewType中使用instanceof。这里的位置由objList的索引决定。
答案 1 :(得分:0)
您有两个独立的ArrayList用于媒体和相册。
ArrayList<Object> mediaList = new ArrayList();
ArrayList<Object> albumList = new ArrayList();
在您的方案中,您需要计算位置。
让我们用一个例子来解决这个问题。
在您的getItemViewType
方法中,您设置的媒体将位于第一组列表中,然后是album.ie,总的Recyclerview大小为10,前8行将是媒体,最后两行将是专辑。
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
int currentPosition = 0;
if ((mediaList.size() - 1) >= position) {
//Since media list is loaded first...
currentPosition = position;
} else {
//Since we are loading the album next we need to take from here...
currentPosition = position - mediaList.size();
}
if (holder instanceof MediaHolder) {
Media m = media.get(currentPosition);
((MediaHolder)holder).bindView(m, currentPosition);
} else if (holder instanceof AlbumHolder) {
Album m = albums.get(currentPosition);
((AlbumHolder)holder).bindView(m, currentPosition);
}
}
如果您在下面的行中有任何ArrayIndexOutOfBound
例外,
currentPosition = position - mediaList.size();
请进行以下更改,
currentPosition = (position - mediaList.size()) - 1;
有关详细信息,请参阅此link,在此示例中,我们已实现了一个页脚,为此我也计算了位置。
希望这有用:)