Android 具有可变项目高度的水平回收视图未正确包装

Android 具有可变项目高度的水平回收视图未正确包装,android,android-recyclerview,horizontallist,Android,Android Recyclerview,Horizontallist,我打算实现的目标 项目视图应占据项目的整个高度 可能是项目高度小于recyclerview中最高项目的高度,在这种情况下,它应该像上面的屏幕截图一样粘贴到顶部 我遇到的bug 如上面的屏幕截图所示,视图被截断 我到目前为止所做的尝试 最初我在recyclerview上使用了wrap_内容,现在它已经得到了支持。当当时屏幕上没有最高的视图时,它就不起作用了。这在视图层次结构的布局中是有意义的如果高度依赖于某个数据,那么如何计算尚未绑定到任何数据的物体的高度? 解决时间:S 我没有尝试定制la

我打算实现的目标

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

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

我遇到的bug

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

我到目前为止所做的尝试

最初我在recyclerview上使用了wrap_内容,现在它已经得到了支持。当当时屏幕上没有最高的视图时,它就不起作用了。这在视图层次结构的布局中是有意义的如果高度依赖于某个数据,那么如何计算尚未绑定到任何数据的物体的高度?

解决时间:S

我没有尝试定制layoutmanager,而是首先做了我认为需要做的事情——在开始时布置所有项目视图,以确定它们的高度

屏幕上部有一个progressbar和一个动画播放,以吸引用户的注意力,而所有这些都是在recyclerview visibility设置为invisible时发生的。我使用了两种方法,其中一种是不够的——我在适配器的
onViewAttached()
调用中附加了一个观察者,还使用了一个滚动更改侦听器。有一个LinearSnapHelper连接到回收器视图,可以捕捉到滚动上相邻(下一个或上一个,取决于滚动方向)的位置

在这个设置中

  • 我将使用
    layoutManager.smoothScrollToPosition()
  • 使用获取子视图高度

            View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition());
            if (currentChildView != null) {
                currentChildHeight = currentChildView.getHeight();
            }
    
  • 在scroll change listener on
    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>