- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试创建一个 ItemDecoration,它将通过向最后一个项目动态添加填充来保持 RecyclerView 的最小高度。
要计算填充量,我需要知道所有 child 的总高度。我通过获取单个 View 的高度并将其乘以适配器中的项目数来对此进行近似。
我遇到的问题是 view.getHeight() 并不总是返回正确的高度。通常第一次调用 getItemOffsets() 时高度比它应该的小很多(例如 30px vs 300px)。即使我在布局 XML 中为 subview 提供固定高度,也会发生这种情况。我猜这与测量/布局周期有关,因为我不确定如何在 ItemDecoration 中获得正确的 View 尺寸。
在 getItemOffsets() 中以编程方式获取 subview 高度的正确方法是什么?
元素装饰:
public class MinHeightPaddingItemDecoration extends RecyclerView.ItemDecoration {
private static final String LOG_TAG = MinHeightPaddingItemDecoration.class.getSimpleName();
private int mMinHeight;
public MinHeightPaddingItemDecoration(int minHeight) {
super();
mMinHeight = minHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) {
int itemCount = state.getItemCount();
int lastPosition = itemCount - 1;
int itemPosition = recyclerView.getChildAdapterPosition(view);
int layoutPosition = recyclerView.getChildLayoutPosition(view);
// If this view isnt on screen then do nothing
if (layoutPosition != RecyclerView.NO_POSITION && itemPosition == lastPosition) {
// NOTE: view.getHeight() doesn't always return the correct height, even if the layout is given a fixed height in the XML
int childHeight = view.getHeight();
int totalChildHeight = childHeight * itemCount;
int minHeight = getMinHeight();
if (totalChildHeight < minHeight) {
outRect.bottom = minHeight - totalChildHeight;
}
}
}
private int getMinHeight() {
return mMinHeight;
}
}
recycler_view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="controller" type="my.ViewController"/>
</data>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:clickable="true"
android:onClick="@{() -> controller.doSomething()}">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Child layout"
/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</layout>
最佳答案
我找到了固定大小的 subview 的解决方法。我仍然不确定如何处理动态大小的布局。
// NOTE: view.getHeight() doesn't always return the correct height
// NOTE: even if the layout is given a fixed height in the XML.
// NOTE: Instead directly access the LayoutParams height value
int childHeight = view.getLayoutParams().height;
关于android - 在 RecyclerView ItemDecoration.getItemOffsets 中获取 subview 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084695/
我正在尝试为 recyclerView 中的每个 ViewHolder 创建多个垂直分隔线,但不知道如何。 这是我工作水平分隔线的代码: @Override public void onDrawOve
我写了一个小 fragment 来在 RecyclerView 的每个项目中显示一条垂直线和一个小球。但是最后一个或只有 1 个项目时永远不会被绘制。 我的装饰: public class Marke
我刚刚开始使用 ItemDecoration。我正在尝试在由 StaggeredGridLayoutManager 管理的两列 RecyclerView 中间实现分隔线。 这是我的 ItemDecor
这是我的第一个堆栈溢出问题。在过去的几个小时里,我一直在试图找到解决这个堆栈溢出问题的方法,但我找不到任何东西。 我在这里创建的应用程序(或特定 Activity )非常简单,基本上是一个包含 Tex
我为使用 GridLayoutManager 的 RecyclerView 创建了自定义 ItemDecoration。 ItemDecoration 本质上确保在 RecyclerView 中应用所
我想知道如何添加item装饰使所有item之间的间距相等,并控制每个外部空间是否有空间 所需的效果: 只留下空格和中间的相等空格: 没有边缘空间,中间有相等的空间: 最佳答案 import andro
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想为 Header Type 绘制一个默认的 ItemDecoration 到 RecycleView 中。但是 divider 是为每个 ViewType 显示的。 自定义装饰: class Di
我有一个带有 2 个 ItemDecorations 的 RecyclerView。我如何指定每个 ItemDecoration 的高度(z-index),以设置将绘制在另一个之上? 最佳答案 来自d
我使用这个 timehop stickyheader 库为我的 recyclerview 创建粘性 header :https://github.com/timehop/sticky-header
我正在使用 RecyclerView.ItemDecoration类在列表中创建分隔线,但我想隐藏列表中最后一项的分隔线。这是否可能无需自己实现分隔线? 最佳答案 你可以试试这个, public cl
我已经知道如何在 ItemDecoration 中绘制东西,但现在我想在 ItemDecoration 中绘制一个 View。 由于设置有点复杂,我创建了一个sample project可以重现问题。
我通过覆盖 getItemOffsets() 方法(请参阅下面的代码)使用 GridLayoutManager 为我的 RecyclerView 应用相等的边距。 但是,当一个对象从适配器中移除时,移
我有一个 RecyclerView(带有 LinearLayoutManager)和一个自定义的 RecyclerView.ItemDecoration。 比方说,我想在装饰 View 中添加按钮(出
我为 RecyclerView 编写了两个 ItemDecorator。每个都在 getItemOffsets() 中添加一些顶部偏移量。比方说: 第一个装饰器添加 20dp 顶部偏移 第二个 dec
我正在为我的 recyclerview 使用自定义项目装饰器,它工作正常。 MyItemDecorationTest.java public class MyItemDecorationTest ex
这是我的场景 我必须在回收器 View 的第一个和最后一个项目上添加空间 我正在使用 ItemDecoration recyclerView.addItemDecoration(new Recycl
我正在尝试使用ItemDecorator将一些分隔符添加到 RecyclerView 中。这是执行此操作的代码 fragment 。 //... public abstract C onInflate
我有一个像这样的简单 RecyclerView: 我在 Fragment 的 onCreate() 方法中添加分隔符: mRv = (RecyclerView) view.findVie
我正在我的应用程序中创建一个显示多个用户之间对话的消息传递功能。对于用户拥有的消息,我希望头像图像右对齐,而对于其他消息,我希望头像左对齐。 为了实现这一点,我在 framelayout 和 onBi
我是一名优秀的程序员,十分优秀!