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

Android– 自定义动态生成的复合视图在RecyclerView中重新创建,导致性能不佳,第1张

概述我正在使用自定义的CompoundView,它扩展了LinearLayout以显示RecyclerView的项目.每个项目显示一篇包含多个段落和图像的文章.CompoundView根据CompoundView.setData(List<DataPiece>件)附加的数据动态添加TextView或ImageView,其数量在附加数据之前是未知的.每个DataPiece对象告

我正在使用自定义的CompoundVIEw,它扩展了linearLayout以显示RecyclerVIEw的项目.每个项目显示一篇包含多个段落和图像的文章. CompoundVIEw根据CompoundVIEw.setData(List< DatAPIece>件)附加的数据动态添加TextVIEw或ImageVIEw,其数量在附加数据之前是未知的.每个DatAPIece对象告诉CompoundVIEw它是一段文本还是图像.这是CompoundVIEw.setData(List< DatAPIece>件)的代码:

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()中,通过调用MyVIEwHolder.compoundVIEw.setData(…)将数据附加到CompoundVIEw.并且在创建RecyclerVIEw时它可以正常工作.
但是,对于具有多个ImageVIEw和TextVIEw的CompoundVIEw项目,当我向外滚动然后向后滚动时,滚动会变得非常不平滑.
我想这是因为调用了setData()中的removeAllVIEws(),并且回收器再次执行了CompoundVIEw创建for循环.但我不知道如何避免这种情况.
我也想知道为什么在RecyclerVIEw中使用TextVIEw(带图像)时滚动总是很平滑,即使它也被回收.
提前致谢!

解决方法:

决定最佳方法可能有多种考虑因素.

首先,您是否了解回收商列表中的最大项目数?如果它只是少数,也许你可以放弃RecyclerVIEw方法,只需将你的CompundVIEw添加到由ScrollVIEw托管的容器中.

其次 – 每个项目的布局相当复杂(a.k.a.里面有很多TextVIEws,ImageVIEws等)?如果是,也许您可​​以采用类似于ExpandableListVIEw的方法 – 将摘要显示为每个列表项并在点击时扩展到项目的完整布局.

第三 – 如果以上都不可接受并且您仍然想要采用当前方法 – 请不要在绑定方法中构造/添加视图.在onCreateVIEwHolder中执行此 *** 作,当系统要求您构建视图时(我不确定,但是当您在onBindVIEwHolder上调用时,您的视图可能已经添加到层次结构中,并且对它的任何分层更改都有对它的容器产生连锁反应 – 但不要相信我的意思,我实际上并不知道视图已被添加,这只是一个假设).您必须为每个项目分配不同的类型,以便在onCreateVIEwHolder中您可以将视图类型与支持数据匹配(用于添加相应数量的子视图);每次都从头开始创建视图 – 这样您就不需要调用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中重新创建,导致性能不佳全部内容,希望文章能够帮你解决Android – 自定义动态生成的复合视图在RecyclerView中重新创建,导致性能不佳所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1119222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存