android – 水平RecyclerView,可变项目高度未正确包装

android – 水平RecyclerView,可变项目高度未正确包装,第1张

概述我打算实现的目标 项目视图应占据项目的整个高度 可能是项目高度小于recyclerview中最高项目的高度,在这种情况下,它应该像上面的屏幕截图一样粘在顶部. 我遇到的错误 如上面的屏幕截图所示,视图被截断. 到目前为止我尝试过的 最初我在recyclerview上使用wrap_content,现在它已得到支持.当当时在屏幕上看不到的任何视图都是最高的时候,它不起作用.这对视图层次结构的布局有意义 我打算实现的目标

项目视图应占据项目的整个高度

可能是项目高度小于recyclervIEw中最高项目的高度,在这种情况下,它应该像上面的屏幕截图一样粘在顶部.

我遇到的错误

如上面的屏幕截图所示,视图被截断.

到目前为止我尝试过的

最初我在recyclervIEw上使用wrap_content,现在它已得到支持.当当时在屏幕上看不到的任何视图都是最高的时候,它不起作用.这对视图层次结构的布局有意义.如果高度取决于该数据,如何计算甚至没有绑定到任何数据的东西的高度?

解决时间:S

我没有尝试自定义布局管理器,而是首先选择了我认为需要完成的工作 – 在开始时列出所有项目视图以确定它们的高度.

在屏幕的上半部分有一个进度条和一个动画,以吸引用户的注意力,而所有这些都发生在recyclervIEw可见性被设置为不可见的情况下.我使用了两件事,一件是不够的 – 我在适配器的onVIEwAttached()调用中附加了一个观察者,并且我也使用了滚动更改侦听器.有一个linearSnapHelper附加到回收器视图,以捕捉到滚动的相邻(下一个或上一个,取决于滚动方向)位置.

在此设置中,

>我将使用layoutManager.smoothScrollToposition()转到recyclervIEw中的每个位置
>使用获取子视图高度

VIEw currentChildVIEw = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemposition());        if (currentChildVIEw != null) {            currentChildHeight = currentChildVIEw.getHeight();        }

在RecyclerVIEw.SCRolL_STATE_IDLE上的滚动更改侦听器中,或者通过将高度传递给适配器的onVIEwAttachedToWindow()中上面提到的视图附加观察器

@OverrIDepublic voID onVIEwAttachedToWindow(BindingVIEwHolder holder) {    if (mObserver != null) {        mObserver.onVIEwAttached(holder.binding.getRoot().getHeight());    }}

>存储maxHeight,其更改为maxHeight和新子高度的最大值.

很明显,这很难看.另外它并没有给我当前视图的高度 – onAttached意味着它只是附加,而不是测量和布局.它是循环视图,而不是绑定到当前数据项的视图.这会出现如上所示的截断视图等问题.

我还在回收器视图上尝试了wrap_content高度,并从回收器的父进程中失效,直到回收器和滚动子进入SCRolL_STATE_IDLE.不起作用.

我不确定自定义布局管理器如何在这里提供帮助.

有人能引导我朝正确的方向发展吗?

解决方法 我无法接受@Pradeep Kumar Kushwaha的回答,因为针对一个解决方案,我不希望列表中有不同的字体大小.一致性是设计中的关键因素.他给出的第二个选择无法工作,因为使用ellipsize我需要给某个“更多”按钮以供用户阅读整个内容,我的文本视图已经采取了点击 *** 作.把更多的地方放在其他地方再也不是好的设计.

当最高的截断项目成为焦点时,通过简单地重新调整RecyclervIEw的大小来改变设计,它变成了notifyItemChanged()的简单用例.即使我使用视图附加的观察者和滚动状态监听器进行的尝试,也可以使用notifyItemChanged,但这种方法太过于Hacky.我可以在代码和设计中使用它.这里是所需的代码.

@OverrIDepublic voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,int newState) {    if (newState == RecyclerVIEw.SCRolL_STATE_IDLE) {        int position = ((linearlayoutmanager) binding.nextRv.getLayoutManager())                .findFirstVisibleItemposition();        if (position != nextSnippetAdapter.getItemCount() - 1) {            binding.nextRv.getAdapter().notifyItemRangeChanged(position,2);        } else {            binding.nextRv.getAdapter().notifyItemChanged(position);        }    }}

对于我的特定设置,只需要这两个元素就可以了.它可以进一步优化,以便在大多数情况下调用位置1的单个元素,并在角落(文字)情况下检查并调用适当的元素.

总结

以上是内存溢出为你收集整理的android – 水平RecyclerView,可变项目高度未正确包装全部内容,希望文章能够帮你解决android – 水平RecyclerView,可变项目高度未正确包装所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存