Android Hetrogenenous recyclerview混蛋和数据模型混淆

问题描述 投票:5回答:1

我有一个包含Horizo​​ntal RecyclerView和Vertical Recyclerview的RecyclerView。我对如何管理两者的数据模型感到困惑。这是我的代码,然后是这个example

public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final int VIEW_TYPE_DESIGN_TYPES = 0;
    private final int VIEW_TYPE_DESIGNS = 1;

    private Context context;
    private ArrayList<Object> feeds;

    public HomeAdapter(Context context, ArrayList<Object> feeds) {
        this.context = context;
        this.feeds = feeds;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0)
            return VIEW_TYPE_DESIGN_TYPES;
        if (position == 1)
            return VIEW_TYPE_DESIGNS;
        return -1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view;
        RecyclerView.ViewHolder holder;
        switch (viewType) {
            case VIEW_TYPE_DESIGN_TYPES:
                view = inflater.inflate(R.layout.item_home_design_types, parent, false);
                holder = new DesignTypesViewHolder(view);
                break;
            case VIEW_TYPE_DESIGNS:
                view = inflater.inflate(R.layout.item_home_designs, parent, false);
                holder = new DesignsViewHolder(view);
                break;
            default:
                view = inflater.inflate(R.layout.item_home_designs, parent, false);
                holder = new DesignsViewHolder(view);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder.getItemViewType() == VIEW_TYPE_DESIGN_TYPES)
            designTypesView((DesignTypesViewHolder) holder);
        else if (holder.getItemViewType() == VIEW_TYPE_DESIGNS)
            designsView((DesignsViewHolder) holder);
    }


    private void designTypesView(DesignTypesViewHolder holder) {
        HomeAdapterDesignTypes homeAdapterDesignTypes = new HomeAdapterDesignTypes(getDesignTypes());
        holder.recyclerView.setAdapter(homeAdapterDesignTypes);
    }

    private void designsView(DesignsViewHolder holder) {
        HomeAdapterDesigns homeAdapterDesigns = new HomeAdapterDesigns(getDesigns());
        holder.recyclerView.setAdapter(homeAdapterDesigns);
    }

    @Override
    public int getItemCount() {
        return feeds.size();
    }

    public void updateFeeds(ArrayList<Object> mFeeds) {
        feeds.addAll(mFeeds);
        notifyDataSetChanged();
    }

    public class DesignTypesViewHolder extends RecyclerView.ViewHolder {
        RecyclerView recyclerView;
        DesignTypesViewHolder(View itemView) {
            super(itemView);
            recyclerView = itemView.findViewById(R.id.rvHomeDesignTypes);
            recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
            ItemOffsetDecoration itemDecoration = new ItemOffsetDecoration(context, R.dimen.item_offset);
            recyclerView.addItemDecoration(itemDecoration);
        }
    }

    public class DesignsViewHolder extends RecyclerView.ViewHolder {
        RecyclerView recyclerView;
        DesignsViewHolder(View itemView) {
            super(itemView);
            recyclerView = itemView.findViewById(R.id.rvHomeDesigns);
            recyclerView.setLayoutManager(new GridLayoutManager(context, 2));
            int spanCount = 2;
            int spacing = 15;
            boolean includeEdge = true;
            recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge));
        }
    }

    private ArrayList<DesignType> getDesignTypes() {
        ArrayList<DesignType> singleHorizontals = new ArrayList<>();
        for(int i = 0 ; i < feeds.size(); i++) {
            Object object = feeds.get(i);
            if(object instanceof DesignType) {
                singleHorizontals.add((DesignType) object);
            }
        }
        return singleHorizontals;
    }

    private ArrayList<Design> getDesigns() {
        ArrayList<Design> singleVerticals = new ArrayList<>();
        for(int i = 0 ; i < feeds.size(); i++) {
            Object object = feeds.get(i);
            if(object instanceof Design) {
                singleVerticals.add((Design) object);
            }
        }
        return singleVerticals;
    }
}

现在,我的Horizo​​ntal recyclerview位于0位置并具有静态数据项。 Vertical RecyclerView是动态的,我想为它实现无限滚动。我不知道如何管理和更新两者的数据模型(POJO类)。因为Recyclerviews的对象类型不同。我应该为两者创建一个共同的POJO类吗?

我面临的另一个问题是,当列表在末尾滚动时会有一个混蛋。

android android-recyclerview android-adapter
1个回答
1
投票

您的父回收器视图看起来只包含两个项目:

@Override
public int getItemViewType(int position) {
    if (position == 0)
        return VIEW_TYPE_DESIGN_TYPES;
    if (position == 1)
        return VIEW_TYPE_DESIGNS;
    return -1;
}

但是从这里我可以看到,如果你有两件以上的东西 - 你最终将所有后续的持有者创建为DesignsViewHolder

default:
            view = inflater.inflate(R.layout.item_home_designs, parent, false);
            holder = new DesignsViewHolder(view);
            break;

如果意图是 - 使用水平滚动的顶级回收器视图和网格项中的下一个回收器视图,那么在一个布局中只有两个回收器视图就可以了。

<ConstraintLayout or ScrollView> - as u wish
  <RecyclerView\> - horizontal one
  <RecyclerView\> - vertical one, or with grid layout manager
<\ConstraintLayout or ScrollView>

编辑:在您的问题附加link我们有一个相反的结构。垂直滚动和带水平滚动的最后一项。在这种情况下,您可以切换Recycler-views排序。

如果你想在你的回收者视图中拥有真正不同的物品,那么考虑使用Adapter Delegates模式是值得的。

注意:在回收站视图内有很多不同的滚动方向不容易维护。有时会发生差异错误,难以解决。在某些情况下,最好在回收器视图中使用滚动视图,而不是在回收器视图中使用回收器视图。 RecyclerView在引擎盖下有一个非常复杂的结构,可以优化性能和项目可重用性。在大多数情况下,在将此布局与垂直滚动混合方面,您需要一些简单的5-10项水平滚动。这里要讨论很多事情,真的依赖于案例。

看看Joe's problem和一个不错的GitHub lib,那些应该有助于Adapters Delegate模式理解。祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.