将支持库从“23.1.1”升级到“23.2.1”后,回收站查看项目填满整个回收站视图高度,

以前,我正在使用以下旧支持库“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' 

它工作得很好。 这是我的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' 

然而,突然之间,我所有的RecyclerView项目似乎都填满了RecyclerView整个高度。

在这里输入图像说明

在这里输入图像说明

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

真正让我困惑的是,尽pipe我在回收器视图项目布局中使用了"wrap_content" ,但它并不像预期的那样工作。

我没有为我的RecyclerView使用任何自定义布局pipe理器。

从http://developer.android.com/tools/support-library/index.html ,我意识到23.2.1这次对RecyclerView做了很多改变。

  • 修正了与各种度量规格方法有关的错误。 (问题201856)
  • 减lessRecyclerView在计算布局或滚动时不允许适配器更改的locking期。 (问题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> 

经过几个小时的debugging,我仍然找不到这样的问题的根源,任何提示?

谢谢。

我曾经试过

我试图改变RecyclerView

 <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" 

 <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" 

它最初看起来不错。 但是,当您执行滚动,东西不能按预期工作: 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); } 

不幸的是, 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 ); 

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

更新

看起来您正在更新Adapter ViewLayoutParam

这是可能的,因为你的用户界面看起来非常好,直到你开始滚动。 这意味着你的XML是正确的,因为它是在你的XML布局文件中定义的。

滚动开始后它发生了变化,这意味着你的onBindViewHolder实现有一个逻辑错误。 这就是为什么当您向下滚动时出现错误,然后当您向后滚动时出现错误。

老答案

你的问题是你的分隔线已经stream氓:

 <View android:layout_width="1px" android:layout_height="match_parent" android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" /> 

出于testing目的,将其设置为:

 <View android:layout_width="1px" android:layout_height="30dp" android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" /> 

确保你改变他们两个!

我有一个类似的问题。 它最终成为回收者不是问题。 检查你的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" ... /> 

如果您不使用CardView,请确保您在适配器中用于视图的元素具有android:layout_height="wrap_content"而不是match_parent

如果失败,可以添加另一个属性,为视图项目设置minHeightmaxHeight

好消息:

我可以指出你改变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中按预期工作。 如果您想执行完整性检查,我可以分享我的实施。

你应该仔细检查你的适配器的实现/操作,即使它被拉得很远。

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

回收视图的高度只能是“wrap_content”。 如果单元格大小增加,回收视图将处理高度。

buy_portfolio_fragment.xml

  <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/buyPortfolioListViewBackground" android:requiresFadingEdge="none" android:scrollbars="vertical" android:paddingTop="@dimen/default_tab_layout_height" android:clipToPadding="false" /> 

我相信这是有问题的一行:

 <View android:layout_width="1px" android:layout_height="match_parent" <!--change this to wrap_content--> android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" /> 

您的布局项目中有两个位置的layout_height =“match_parent”。 您应该将它们都更改为wrap_content。

只需row_layout高度设置为wrap_content这样所有的项目都只占用行的实际高度空间。