当前位置: 首页 > 知识库问答 >
问题:

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

段阳夏
2023-03-14

我想要达到的目标

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

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

我遇到的虫子

正如上面的截图所示,视图正在被截断。

到目前为止我都试过了

起初,我在回收视图上使用wrap_content,现在它得到了支持。当当时屏幕上可见的视图都不是最高的时,它就不起作用了。这在视图层次结构的布局中是有意义的。如果高度依赖于任何数据,那么甚至还没有绑定到任何数据的东西的高度如何计算呢?

变通时间:S

我没有尝试自定义布局管理器,而是先做了我觉得需要做的事情——在开始时列出所有项目视图来计算它们的高度。

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

在这个设置中,

>

        View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition());
        if (currentChildView != null) {
            currentChildHeight = currentChildView.getHeight();
        }

RecyclerView上滚动change listener。滚动_STATE_IDLE,或者将高度传递给适配器的onViewAttachedToWindow()中提到的视图连接观察者

@Override
public void onViewAttachedToWindow(BindingViewHolder holder) {
    if (mObserver != null) {
        mObserver.onViewAttached(holder.binding.getRoot().getHeight());
    }
}

很明显,这很难看。另外,它没有给我当前视图的高度——“附加”意味着它只是附加的,而不是测量和布局的。这是回收的视图,而不是绑定到当前数据项的视图。这就带来了如上所示的视图截断等问题。

我还尝试过在“回收者”视图中显示“包裹内容高度”,并从回收者的家长处进行无效处理,直到回收者和滚动条上的孩子进入滚动状态。没用。

我不知道如何自定义布局管理器可以帮助这里。

有人能指引我正确的方向吗?

共有3个答案

陆宏壮
2023-03-14

我认为recyclerview可以设置为高度wrap\u content。而且这些项目可以像高度一样匹配父项。

<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>

我的要求只不过是这个问题。连我的问题都解决了。

记住我正在使用:

安德洛伊德。recyclerview:recyclerview:1.0.0-beta01

项目的依赖性

乜飞航
2023-03-14

在你的适配器里,我可以找到两张卡,一张在上面,另一张在下面

我如何定义我的布局是这样的:

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库--

希望有帮助。

乐正烨熠
2023-03-14

我不能接受@Praave Kumar Kushwaha的回答,因为针对一个解决方案,我不希望列表中出现不同的字体大小。一致性是设计中的一个关键因素。他给出的第二种选择不起作用,因为对于椭圆大小,我需要给用户一个某种“更多”按钮来阅读整个内容,而我的文本视图已经在进行点击操作。把更多放在其他地方同样不是好的设计。

通过调整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处调用单个元素,并在角落(文字)情况下检查和调用适当的元素。

 类似资料:
  • 我试图实现带有水平滚动的,所以我使用了带有水平方向的。问题是,我使用2种不同类型的项目填充RecyclerView,具有不同的高度。这是我对项目使用的布局: 这是包含的布局,基本上是这样的: 我使用的是一个,我只是更改了两个子视图的可见性。 我希望得到的结果是: 但我得到的是这个;使用第二种物品的高度将CardView切成两半: 我看到了这个帖子,和我的问题差不多,它推荐使用,于是,我尝试实现:

  • 我正在尝试为水平回收视图实现ItemTouchHelper。(将布局管理器设置为LinearLayoutManager,方向为LinearLayoutManager.HORIZONTAL)。例如,我想在向下滑动并向左或向右拖动以交换项目时删除项目。 我所经历的所有示例都解释了ItemTouchHelper的垂直回收站视图或网格中的项目。 以下示例来自以下链接: https://medium.com

  • 当我按下后退按钮时,这个ShoppingActivity会被破坏,当我再次访问该activity时,我发现我的回收器视图项目被替换了两次。我该如何解决这个问题? ShoppingActivity.java这里编写的所有代码和volley类也在这里调用,当我按下后退键并再次访问该活动时,我发现我的回收器视图项被替换了 @override protected void onCreate(Bundle

  • 我想知道是否有任何可能的方法使用RecyclerView? 在此之前,我在ScrollView中使用了具有固定高度的RecyclerView,但这次我不知道项目的高度。 提示:在提出这个问题之前,我阅读了堆栈问题的所有问题和解决方案。 更新:一些解决方案显示了如何自行滚动RecyclerView,但我想显示它已扩展。

  • 我想做的从右到左滚动与我猜将是一个recylcer视图,但不确定是否是这个。我只是需要有人给我指明正确的方向。我想我需要一个内部布局的回收视图。 如果有人能指点我在哪里找到答案,我会变得很伟大!

  • 新加入WPF的我正尝试使用TreeView,它提供的灵活性给我留下了难以置信的印象。 到目前为止,我的每个treeview项目都实现了一个扩展器,这是显示每个项目更详细信息并让标题仅显示摘要的好方法。但是,这不适合叶项目,并且浪费了屏幕空间——我的treeview中的每个叶项目(其中有许多)显示的数据量相对较小。 我想要为叶项目实现的是水平包装,而不是垂直列表。设想显示一个网格或(stackpan