gpt4 book ai didi

Android - 在 RecyclerView 中重新创建自定义动态生成的复合 View ,导致性能不佳

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

我正在使用自定义 CompoundView延伸LinearLayout显示 RecyclerView 的项目.每个项目显示一篇包含多个段落和图像的文章。

CompoundView添加 TextViewImageView动态地基于 CompoundView.setData(List<DataPiece> pieces) 附加的数据,其中的数量在附加数据之前是未知的。

每个DataPiece对象告诉 CompoundView无论是一段文字还是一张图片。这是 CompoundView.setData(List<DataPiece> pieces) 的代码:

public void setData(List<DataPiece> pieces) {
removeAllViews();
for (DataPiece dataPiece : pieces) {
switch (dataPiece.getType()) {
case IMAGE:
ImageView imageView = new ImageView(getContext());
...
addView(imageView);
break;
case TEXT:
TextView textView = new TextView(getContext());
...
addView(textView);
break;
}
}
}

RecyclerView.Adapter.onBindViewHolder() ,数据附在CompoundView调用MyViewHolder.compoundView.setData(...) .当 RecyclerView 时它工作正常被 build 。

但是,对于 CompoundView具有多个 ImageView 的项目s 和 TextView s,当我远离它滚动然后向后滚动时,滚动变得非常不平滑。

我猜是因为 removeAllViews()setData()被调用,CompoundView创建循环由回收器再次执行。但我不知道如何避免这种情况。

而且我也想知道为什么使用 TextView 时滚动总是很平滑(带图片)在 RecyclerView甚至它也被回收了。

提前致谢!

最佳答案

在决定什么是最佳方法时,可以考虑多种因素。

首先,您是否知道回收商列表中的最大元素数量?如果只是少数,也许你可以放弃 RecyclerView方法,只需添加您的 CompoundView放入由 ScrollView 托管的容器中.

其次 - 每个项目的布局是否相当复杂(也就是其中有很多 TextViewsImageViews 等)?如果是,也许您可​​以采取类似于 ExpandableListView 的方法- 显示每个列表项的摘要,并在点击时扩展到项目的完整布局。

第三 - 如果以上都 Not Acceptable ,并且您仍想采用当前方法 - 不要在绑定(bind)方法中构建/添加您的 View 。在 onCreateViewHolder 中进行,当系统希望您构建 View 时(我不确定,但是当您被调用时 onBindViewHolder 您的 View 可能已经添加到层次结构中,并且对其进行的任何层次结构更改都会产生链式 react 在它的容器上 - 但不要相信我的话,我实际上并不知道已经添加了 View ,这只是一个假设)。您必须为每个项目分配不同的类型,以便在 onCreateViewHolder 中您可以将 View 类型与支持数据相匹配(用于添加相应数量的 subview );每次都从头开始创建 View - 这样您就不需要调用 removeAllViews .类似的东西(我遗漏了与案例无关的适配器部分):

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<DataPiecesList> mItems;
public RecyclerViewAdapter(ArrayList<DataPiecesList> items) {
mItems = items;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CompoundView compoundView = new CompoundView();
List<DataPiece> dataPieces = mItems.get(viewType);
for (int i = 0; i < dataPieces.size(); i++)
{
// construct TextView or ImageView or whatever
compoundView.add(child);
}
MyViewHolder view = new MyViewHolder(compoundView);
return view;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
CompoundView compoundView = viewHolder.itemView;
DataPiece dataPiece = mItems.get(i);
for (int j = 0; j < compoundView.getChildCount(); j++)
{
compoundView.getChildAt(j) <- dataPiece.get(j);
}
}

@Override
public int getItemViewType(int position) {
return position;
}

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

public class MyViewHolder extends RecyclerView.ViewHolder {
...
public MyViewHolder(View itemView) {
super(itemView);
}
}
}

关于Android - 在 RecyclerView 中重新创建自定义动态生成的复合 View ,导致性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144806/

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