我正在使用自定义的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中重新创建,导致性能不佳所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)