将支持库从"23.1.1"升级到"23.2.1"后,Recycler视图项填满整个回收站视图高度

Che*_*eng 44 android android-support-library android-recyclerview android-support-design

以前,我使用以下旧的支持库"23.1.1".

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:preference-v7:23.1.1'
compile 'com.android.support:preference-v14:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
Run Code Online (Sandbox Code Playgroud)

它工作得很好.这就是我的RecyclerView样子

在此输入图像描述

现在,由于修复了一些错误,我希望迁移到"23.2.1".

compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:preference-v7:23.2.1'
compile 'com.android.support:preference-v14:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:recyclerview-v7:23.2.1'
Run Code Online (Sandbox Code Playgroud)

然而,突然之间,我所有的RecyclerView物品,似乎都填满了RecyclerView整个高度.

在此输入图像描述

在此输入图像描述

这是我的布局文件的代码片段:https://gist.github.com/yccheok/241a0d38d56305a1be24d09b54eb1600

让我感到困惑的是,尽管我"wrap_content"在我的回收站视图项目布局中使用它,但它并没有按预期工作.

我没有使用任何自定义布局管理器RecyclerView.

http://developer.android.com/tools/support-library/index.html,我意识到23.2.1在RecyclerView这个时候做了很多改变.

  • 修复了与各种测量规范方法相关的错误.(问题201856)
  • RecyclerView在计算布局或滚动时减少了不允许适配器更改的锁定时间.(问题202046)
  • 修复了调用notifyItemChanged()不在视图中的项目时发生崩溃的问题.(问题202136)
  • 修复了RecyclerView.LayoutManager在同一测量过程中添加和删除视图时发生的崩溃.(问题193958)

我最怀疑的是https://code.google.com/p/android/issues/detail?id=201856,因为它涉及更改各种测量规范方法

到目前为止,我尝试使用一个简单的RecyclerView项目重现问题,使用23.2.1但是失败了!它没有"项目填满RecyclerView整个高度"的问题.我的猜测是,我的简单项目不能模拟生产项目的复杂布局结构.我的制作项目有以下布局

<Activity>
    <Fragment>
        <View Pager>
            <Fragment>
                <RecyclerView />
            </Fragment>
        </View Pager>
    </Fragment>
</Activity>
Run Code Online (Sandbox Code Playgroud)

经过几个小时的调试,我还是找不到这个问题的根本原因,有什么提示吗?

谢谢.

我曾经尝试过的

我试图改变 RecyclerView

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
Run Code Online (Sandbox Code Playgroud)

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
Run Code Online (Sandbox Code Playgroud)

最初看起来不错.但是,当您执行滚动时,事情无法正常工作:https://www.youtube.com/watch?v = U2EChFn6WkI

更新:我终于找出了根本原因

错误在我身边!由于我需要为最后一行项设置不同的余量,这是我的适配器代码.

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    final List<TransactionSummary> transactionSummaries = buyArray.transactionSummaries;

    if (position == transactionSummaries.size() - 1) {
        holder.itemView.setLayoutParams(lastLayoutParams);
    } else {
        holder.itemView.setLayoutParams(normalLayoutParams);
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,lastLayoutParamsnormalLayoutParams被初始化为

    normalLayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
    );

    lastLayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
    );
Run Code Online (Sandbox Code Playgroud)

使用LinearLayout.LayoutParams.WRAP_CONTENT解决问题.

Kno*_*sos 17

更新

看来,要更新LayoutParamView在你的Adapter.

可以这样说,因为在您开始滚动之前,您的UI看起来非常好.这意味着您的XML是正确的,因为它在XML布局文件中定义.

滚动开始后它发生变化的事实意味着您的onBindViewHolder实现中存在逻辑错误.这就是当您向下滚动时出现错误,然后在向上滚动时错误消失的原因.

老答案

你的问题是你的分频器已经流氓:

<View
    android:layout_width="1px"
    android:layout_height="match_parent"
    android:background="?attr/buyPortfolioSeperatorBackground"
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp" />
Run Code Online (Sandbox Code Playgroud)

出于测试目的,将其设置为:

<View
    android:layout_width="1px"
    android:layout_height="30dp"
    android:background="?attr/buyPortfolioSeperatorBackground"
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp" />
Run Code Online (Sandbox Code Playgroud)

确保你改变它们!

  • 你是对的.您的建议触发我仔细重新检查我的适配器代码.我确实动态地改变了'LayoutParams`.谢谢. (2认同)

Pat*_*k W 10

我遇到了类似的问题.它非常重视回收商不是问题.检查您的CardView项目测量值是否转换为以下内容:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...
/>
Run Code Online (Sandbox Code Playgroud)

如果你不使用CardView,确保您在适配器使用视图的元素有android:layout_height="wrap_content"和没有match_parent.

如果这不起作用,您可以添加另一个属性设置minHeightmaxHeight视图项.


Sev*_*vle 8

好消息:

我可以确切地指出改变RecyclerView行为的确切版本:它不是23.2.1的变化,而是23.2.0(2016年2月)的变化.进一步来说:

RecyclerView.LayoutManager不再忽略某些RecyclerView.LayoutParams设置,例如滚动方向上的MATCH_PARENT.

注意:这些提升的限制可能会导致布局中出现意外行为.确保指定正确的布局参数.

实际上,如果启动23.2.0库,您将看到相同的行为.在您的情况下,这种行为可以简化为:

现在,当您使用RecyclerView的子项时android:layout_x="match_parent",这将影响RecyclerView android:layout_x,而在23.1.1及更早版本中则不然.

坏消息:

即使我99%确定这是您的问题背后的原因,我仍然无法在您的代码中看到问题.我实际上用一个LinearLayoutManager设置了一个带有XML结构的RecyclerView(只改变颜色/背景参数),它在23.2.1中按预期工作.如果您想要进行健全性检查,我可以分享我的实施.

你应该仔细检查你的适配器实现/操作,即使它已经拉长了.


小智 5

要修复此错误row_layout应该具有固定的高度或wrap_content!我也有这个问题,刚刚意识到row_layout的高度是match_parent。