gpt4 book ai didi

android - 使 RecyclerView 中的最后一个 Item/ViewHolder 填充屏幕的其余部分或具有最小高度

转载 作者:可可西里 更新时间:2023-11-01 19:07:11 34 4
gpt4 key购买 nike

我正在为 RecyclerView 苦苦挣扎。我使用回收器 View 来显示我的模型类的详细信息。

//My model class
MyModel {
String name;
Double latitude;
Double longitude;
Boolean isOnline;
...
}

由于某些值可能不存在,我将 RecyclerView 与自定义 View 类型(一个代表我模型的每个值)一起使用。

//Inside my custom adapter
public void setModel(T model) {
//Reset values
itemCount = 0;
deviceOfflineViewPosition = -1;
mapViewPosition = -1;

//If device is offline, add device offline item
if (device.isOnline() == null || !device.isOnline()) {
deviceOfflineViewPosition = itemCount;
itemCount++;
}

//Add additional items if necessary
...

//Always add the map as the last item
mapViewPosition = itemCount;
itemCount++;

notifyDataSetChanged();
}

@Override
public int getItemViewType(int position) {
if (position == deviceOfflineViewPosition) {
return ITEM_VIEW_TYPE_OFFLINE;
} else if (position == mapViewPosition) {
return ITEM_VIEW_TYPE_MAP;
} else if (...) {
//Check for other view types
}
}

使用 RecyclerView,我可以在运行时轻松确定哪些值可用,并将相应的项目添加到 RecyclerView 数据源。我简化了代码,但我的模型有更多的值,而且我有更多的 View 类型。

RecyclerView 中的最后一项始终是 map ,并且始终存在。即使我的模型中没有任何值(value),至少也会有一项,即 map 。

问题:如何让 RecyclerView 中的最后一个项目填满屏幕上的剩余空间并设置最小高度。大小应为较大的值:剩余空间或最小高度。例如:

  • 模型有一些值,总计占 600dp 屏幕的 100dp -> map 高度应为 500dp
  • 模型有很多值,总共占用 600dp 屏幕的 500dp -> map 高度应为最小值 200dp
  • 模型没有值 -> map 填满整个屏幕

enter image description here

最佳答案

您可以在布局最后一个项目后找到 RecyclerView 中的剩余空间,并将剩余空间添加到最后一个项目的 minHeight

val isLastItem = getItemCount() - 1 == position
if (isLastItem) {
val lastItemView = holder.itemView
lastItemView.doOnLayout {
val recyclerViewHeight = recyclerView.height
val lastItemBottom = lastItemView.bottom
val heightDifference = recyclerViewHeight - lastItemBottom
if (heightDifference > 0) {
lastItemView.minimumHeight = lastItemView.height + heightDifference
}
}
}

onBindHolder 中使用 getItemCount() - 1 == position 检查项目是否为最后一项。如果它是最后一个项目,通过用 lastItem 底部减去 recyclerView 高度来找到高度差(getBottom() 给你 View 相对于它的父级的最底部像素。在这种情况下,我们的父级是RecyclerView).

如果差异大于 0,则将其添加到最后一个 View 的当前高度并将其设置为 minHeight。我们将其设置为 minHeight 而不是直接设置为 height 以支持最后一个 View 的动态内容更改。

注:此代码为Kotlin,doOnLayout函数来自Android KTx .此外,您的 RecyclerView 高度应该是 match_parent 才能正常工作(我想这很明显)。

关于android - 使 RecyclerView 中的最后一个 Item/ViewHolder 填充屏幕的其余部分或具有最小高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253811/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com