Android 具有可变项目高度的水平回收视图未正确包装
我打算实现的目标 项目视图应占据项目的整个高度 可能是项目高度小于recyclerview中最高项目的高度,在这种情况下,它应该像上面的屏幕截图一样粘贴到顶部 我遇到的bug 如上面的屏幕截图所示,视图被截断 我到目前为止所做的尝试 最初我在recyclerview上使用了wrap_内容,现在它已经得到了支持。当当时屏幕上没有最高的视图时,它就不起作用了。这在视图层次结构的布局中是有意义的如果高度依赖于某个数据,那么如何计算尚未绑定到任何数据的物体的高度? 解决时间:S 我没有尝试定制layoutmanager,而是首先做了我认为需要做的事情——在开始时布置所有项目视图,以确定它们的高度 屏幕上部有一个progressbar和一个动画播放,以吸引用户的注意力,而所有这些都是在recyclerview visibility设置为invisible时发生的。我使用了两种方法,其中一种是不够的——我在适配器的Android 具有可变项目高度的水平回收视图未正确包装,android,android-recyclerview,horizontallist,Android,Android Recyclerview,Horizontallist,我打算实现的目标 项目视图应占据项目的整个高度 可能是项目高度小于recyclerview中最高项目的高度,在这种情况下,它应该像上面的屏幕截图一样粘贴到顶部 我遇到的bug 如上面的屏幕截图所示,视图被截断 我到目前为止所做的尝试 最初我在recyclerview上使用了wrap_内容,现在它已经得到了支持。当当时屏幕上没有最高的视图时,它就不起作用了。这在视图层次结构的布局中是有意义的如果高度依赖于某个数据,那么如何计算尚未绑定到任何数据的物体的高度? 解决时间:S 我没有尝试定制la
onViewAttached()
调用中附加了一个观察者,还使用了一个滚动更改侦听器。有一个LinearSnapHelper连接到回收器视图,可以捕捉到滚动上相邻(下一个或上一个,取决于滚动方向)的位置
在这个设置中
layoutManager.smoothScrollToPosition()
View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition());
if (currentChildView != null) {
currentChildHeight = currentChildView.getHeight();
}
RecyclerView.scroll\u STATE\u IDLE
中,或者通过将高度传递给适配器的onViewAttachedToWindow()中提到的视图连接的观察者
maxHeight
,该值将更改为maxHeight和新儿童身高的最大值我还尝试过在“回收者”视图中包装内容高度,并从回收者的父级开始使其无效,直到回收者和滚动条上的子级进入滚动状态。不起作用
我不确定定制的布局经理在这里能帮上什么忙
有人能指引我正确的方向吗?在你的适配器里,我可以找到两张卡,一张在上面,另一张在下面 我如何定义我的布局是这样的:
Cardview1
LinearLayout1 --> orientation vertical
cardview2 (Top card where text is written)
Linearlayout2 (where I can see icons such as like etc)-->orientation horizontal
现在,通过将Linearlayout2设置为“包裹内容”来固定其高度
cardview2的高度应为0dp,加上重量=1
现在,在cardview2内部添加一个TextView1,以在高度和宽度上匹配父对象
更好的内置文本视图1在末尾添加省略号并添加最大行数
如果要显示所有行,请尝试查找autoresizetextview库,可以在此处找到它-->
希望有帮助。我不能接受@Pradeep Kumar Kushwaha的答案,因为针对一种解决方案,我不希望列表中出现不同的字体大小。一致性是设计中的一个关键要素。他给出的第二个备选方案不起作用,因为使用ellipsize,我需要给用户提供某种“更多”按钮,以便用户阅读整个内容,而我的文本视图已经在执行单击操作。把更多的东西放在别的地方也不是好的设计 通过调整recyclerview的大小来改变设计当最高的、被截断的项成为焦点时,它将变成notifyItemChanged()的简单用例。即使我尝试使用视图连接的观察器和滚动状态侦听器,也可以使用notifyItemChanged,但这种方法太粗糙了。这一点我在代码和设计中都能接受。下面是所需的代码
@Override
public 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调用单个元素,并在角落(文字)情况下检查和调用适当的元素。我认为可以将recyclerview设置为高度包裹内容
。这些项目可以像高度一样匹配父项
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layput_height="wrap_content"/>
项目如下:
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
// your coode
</androidx.constraintlayout.widget.ConstraintLayout>
//你的笨蛋
我的要求只不过是这个问题。连我的问题都解决了
请记住,我正在使用:
androidx.recyclerview:recyclerview:1.0.0-beta01
项目的依赖关系您可以添加xml文件吗请查找该文件问题中的recyclerview是id为“next_rv”的文件。实际上,对于上面详细介绍的解决方案,最初我将其设置为“高度匹配父项”,然后将高度重置为maxHeight
获得的回答感谢。Ellipsize是一种解决方法,它不能解决我的查询。我知道autoresizetextview:),但我并不是在我的列表中寻找可变字体大小。这是一种设计折衷,因为屏幕上的东西必须移动才能使整个项目聚焦(使用binding.contentScrollView.fullScroll(ScrollView.focus_DOWN);
)实际上这并不是一个大的设计折衷。如果我不滚动到滚动视图底部,事情看起来很好。可以感觉到,视图已经增加并溢出了屏幕,因此用户可以滚动自己来查看整个内容。您有这方面的代码示例吗?我对使用此方法的上下文感到困惑。您好,我使用它将水平recyclerview的高度重新调整为内容高度(即列表项高度),其中列表项高度是可变的。在我的情况下,它不起作用。它会刷新中的2个项目
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
// your coode
</androidx.constraintlayout.widget.ConstraintLayout>