[英]Organize views in RecyclerView by their Position
這是我的FeedAdapter:
public class FeedAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int VIEW_TYPE_VERTICAL = 1;
private final int VIEW_TYPE_HORIZONTAL = 2;
private final int VIEW_TYPE_AD = 3;
private Context context;
private ArrayList<Object> items;
private List<Vertical> listVertical;
private List<Horizontal> listHorizontal;
private List<Adlist> listAd;
public FeedAdapter(Context context, ArrayList<Object> items, List<Vertical> listVertical,List<Horizontal> listHorizontal, List <Adlist> adList) {
this.context = context;
this.items = items;
this.listVertical = listVertical;
this.listHorizontal = listHorizontal;
this.listAd = adList;
}
我的Feed中有一個水平,垂直和另一個AD視圖(這與Goggle Ad Service btw無關)。 Items =三個不同的項目,因此三個不同的視圖
Fot更好地理解:這個onCreate方法:
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view;
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case VIEW_TYPE_VERTICAL:
view = inflater.inflate(R.layout.newsfeed_vertical,viewGroup,false);
holder = new VerticalViewHolder(view);
break;
case VIEW_TYPE_HORIZONTAL:
view = inflater.inflate(R.layout.newsfeed_horizontal,viewGroup,false);
holder = new HorizontalViewHolder(view);
break;
case VIEW_TYPE_AD:
view = inflater.inflate(R.layout.newsfeed_vertical,viewGroup,false);
holder = new AdViewHolder(view);
break;
一個這個onBindViewHolder:
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == VIEW_TYPE_VERTICAL)
verticalView((VerticalViewHolder) holder);
else if (holder.getItemViewType() == VIEW_TYPE_HORIZONTAL)
horizontalView((HorizontalViewHolder) holder);
else if (holder.getItemViewType() == VIEW_TYPE_AD)
adView((AdViewHolder) holder);
}
public void verticalView (VerticalViewHolder holder ){
VerticalScrollAdapter adapter_v = new VerticalScrollAdapter(listVertical);
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context));
holder.recyclerView.setAdapter(adapter_v);
}
public void horizontalView (HorizontalViewHolder holder) {
HorizontalScrollAdapter adapter_h = new HorizontalScrollAdapter(listHorizontal);
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false));
holder.recyclerView.setAdapter(adapter_h);
}
public void adView (AdViewHolder holder) {
AdScrollAdapter adapter_ad = new AdScrollAdapter(adList);
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context));
holder.recyclerView.setAdapter(adapter_ad);
}
所以我使用getItemViewType來理解我正在解析哪個視圖:
@Override
public int getItemCount() {
Log.e("items.size", String.valueOf(items.size()));
return items.size();
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof Vertical)
return VIEW_TYPE_VERTICAL;
if (items.get(position) instanceof Horizontal)
return VIEW_TYPE_HORIZONTAL;
if(items.get(position) instanceof Adlist)
return VIEW_TYPE_AD;
return -1;
}
但有了這個我的Feed獲得了以下結構:
我想像這樣組織我的Feed
VERTIAL VIEW [0] = only 1 view (a box basically) with the first position of the LinearLayout Manager
HORIZONTAL VIEW = full list of my horizontal Views here / second position of my LinearLayoutManager
AD VIEW [0] = at the third position
VERTICAL VIEW [1-5]
AD VIEW [1] = @ position 6 in the LinearLayout
VERTICAL VIEW [5- ** ]
所以我知道我必須使用findViewHolderForAdapterPosition和findViewHolderForLayoutPosition,但是:我在哪里把它們放在我的代碼中?
對items
列表進行排序/構建,使其具有正確順序的項目。
理想情況下,您將從分區的三種類型開始(即一個Vertical
項列表,第二個Horizontal
項列表和第三個Ad
項列表)。 然后你可以像這樣構建你的整體列表:
this.items = new ArrayList<>();
if (listVertical.size() > 0) {
items.add(listVertical.remove(0));
}
if (listHorizontal.size() > 0) {
items.add(listHorizontal.remove(0));
}
while (listVertical.size() > 0 || listAd.size() > 0) {
if (listAd.size() > 0) {
items.add(listAd.remove(0));
}
int count = 5;
while (count > 0 && listVertical.size() > 0) {
items.add(listVertical.remove(0));
}
}
這將添加一個垂直視圖,然后是一個水平視圖,然后在循環中添加一個廣告視圖+五個垂直視圖,直到您“廣告”廣告視圖和垂直視圖為止。 我相信這符合你想要的結構。
最后,您的三個列表將為空(因為您將從中remove()
d所有項目)。 如果您需要避免這種情況,可以創建副本:
List<Vertical> verticalCopy = new ArrayList<>(listVertical);
// and so on
然后你可以在上面的代碼中使用verticalCopy
而不是listVertical
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.