gpt4 book ai didi

Android Hetrogenous recyclerview SCSS 和数据模型困惑

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:13 24 4
gpt4 key购买 nike

我有一个包含水平 RecyclerView 和垂直 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 类吗?

我面临的另一个问题是列表滚动到最后时出现卡顿。

最佳答案

看起来你的父回收 View 被设计成只包含两个项目:

@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;

如果 Intent 是 - 在网格项目中拥有水平滚动的顶级回收器 View 和下一个回收器 View ,那么在一个布局中只有两个回收器 View 是完全可以的。

<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 模式。

注意:回收器 View 中有很多不同的滚动方向不容易维护。有时会出现难以修复的差异错误。在某些情况下,在回收器 View 中使用 ScrollView 会更容易,而不是 回收 View 内的回收 View 。RecyclerView 在底层有一个相当复杂的结构,它优化了性能和项目的可重用性。在大多数情况下,就将此布局与垂直滚动混合而言,您需要一些简单的东西,其中包含 5-10 个用于水平滚动的项目。这里有很多事情要讨论,具体情况视情况而定。

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

关于Android Hetrogenous recyclerview SCSS 和数据模型困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55086506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com