Android 回收视图中的项目未填充它';s宽度匹配\u父项
我的Android 回收视图中的项目未填充它';s宽度匹配\u父项,android,android-recyclerview,Android,Android Recyclerview,我的回收视图及其子项有问题。它们不会扩展到整个android:layout\u width=“match\u parent”或fill\u parent。两种我都试过了。问题是,这项工作做得很完美,没有任何改变,但不知何故,它遭到了破坏 我在一个片段对话框中显示这一点,当我上下滚动视图时,子项只会像包裹内容那样展开,它们会完全展开,但只要我单击它们(我调用notifyDataSetChanged()),它们就会再次收缩 这是一张正确填充的项目的图片,下面是它们在加载或通知数据时的状态。另外,我使
回收视图及其子项有问题。它们不会扩展到整个android:layout\u width=“match\u parent”
或fill\u parent
。两种我都试过了。问题是,这项工作做得很完美,没有任何改变,但不知何故,它遭到了破坏
我在一个片段对话框中显示这一点
,当我上下滚动视图时,子项只会像包裹内容那样展开,它们会完全展开,但只要我单击它们(我调用notifyDataSetChanged()
),它们就会再次收缩
这是一张正确填充的项目的图片,下面是它们在加载或通知数据时的状态。另外,我使用的StickHeaderAdapter
,在我单击其中一个项目之前不会显示标题(这在以前是有效的,我也没有对该部分进行任何更改)
以下是子行的代码:
<?xml version="1.0" encoding="utf-8"?>
<carbon.widget.LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:carbon_rippleColor="@color/green"
app:carbon_rippleStyle="background">
<carbon.widget.TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/block_name"
android:padding="@dimen/block_row_padding"
android:layout_weight="1"
android:textSize="@dimen/block_row_text_size"
android:textColor="@color/black"
app:carbon_rippleColor="@color/green"
app:carbon_rippleStyle="background"/>
<RelativeLayout
android:id="@+id/download_layout"
android:layout_width="64dp"
android:layout_height="match_parent"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:visibility="gone">
<carbon.widget.ProgressBar
android:id="@+id/downloading_bar"
app:carbon_progressStyle="circular_indeterminate"
app:carbon_barWidth="5dp"
app:carbon_tint="@color/green"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_margin="8dp"
android:visibility="invisible"/>
<carbon.widget.TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/block_progress_download"
android:textSize="12sp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:visibility="invisible" />
</RelativeLayout>
这是绑定代码(如果有帮助):
@Override
public void onBindViewHolder(BlockAdapter.ViewHolder holder, int position) {
if (blockData.isDownloading()) {
holder.download_layout.setVisibility(View.VISIBLE);
holder.download_bar.setVisibility(View.VISIBLE);
if (blockData.getProgress() != null) {
holder.download_progress.setVisibility(View.VISIBLE);
holder.download_progress.setText(String.format("%d%%", blockData.getProgress()));
}
} else {
holder.download_layout.setVisibility(View.GONE);
holder.download_bar.setVisibility(View.GONE);
holder.download_progress.setVisibility(View.GONE);
}
if (selected) {
holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.green));
holder.block_name.setTextColor(mContext.getResources().getColor(R.color.white));
} else {
holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.white));
holder.block_name.setTextColor(mContext.getResources().getColor(R.color.black));
}
}
我不知道为什么早上工作,后来又变了
我尝试过的事情:
- 更改
match_parent
的fill_parent
- 将
RecyclerView.LayoutParams
设置为LayoutParams.MATCH\u PARENT
- 通过编程更改宽度
- 将createViewHolder从
更改为…,父级,false)代码>到…,空)编码>并分别添加参数
- 记录宽度(有时是390,当我滚动到990,然后单击返回到390时)
- 设置粘贴头
StickHeaders
的时间越早越好,但是当它们被创建时,它们都被设置好了,并且标题在那里,它只是不可见
感谢您的帮助 问题出在新的支持库
23.2.0
中,因此我将其恢复为23.1.1
,它工作正常。如果我找到了一个解决方案,或者改变了什么,我会让你知道,否则,如果其他人找到了更好的答案,我会让这个线程打开
更新
好的,所以我决定是时候解决这个问题了,因为我们需要转移到新的支持库,我终于找到了答案
问题是新的LayoutManager
正在使用autoMeasure()
首先创建LinearLayoutManager llm=newlinearlayoutmanager(getActivity())代码>
然后llm.setAutoMeasureEnabled(false)代码>
最后,将LinearLayoutManager
设置为您的RecyclerView
,但在RecyclerView.setAdapter(您的适配器)之后执行此操作代码>
下面是一个简单的例子:
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setAutoMeasureEnabled(false);
recyclerView.setLayoutManager(llm);
要绕过此错误,我更改了:
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity());
与:
我也有同样的问题。它只发生在某些视图上,并且是可复制的
不管出于什么原因,重写setAutoMeasureEnabled以返回false都不起作用
我使用androidx.recyclerview:recyclerview:1.1.0
我通过重置视图的宽度以匹配父视图的宽度来解决此问题,即
this.itemView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
this.itemView.requestLayout();
在绑定ViewHolder的末尾this.itemView
在本例中是ViewHolder的根视图,即androidx.recyclerview.widget.recyclerview.ViewHolder.itemView
是否尝试使用正常的线性布局?我不知道什么是carbon.widget.LinearLayout
,或者它是做什么的。它只是为点击项目增加了涟漪效应。它以前就这样做过:/嗯,它做了一些定制测量,所以我不完全相信这一点。如果它与正常布局兼容,你应该试试。我试过了,但与正常布局不兼容。我发现这些.setLayoutManager()
和.setAdapter()
存在订购错误这对我来说有点可笑,谢谢。我使用RecyclerView 25.2.0,我先设置布局管理器,然后设置AutomeasureEnabled(false),然后设置工作的适配器,然后在setAdapter
之前设置setAutoMeasureEnabled
也工作。我的RecyclerView
版本是v26.1.0,因为API v27.1.0,我们需要扩展LinearLayoutManager并重写isAutoMeasureEnabled()函数以返回false,因为setAutoMeasureEnabled()方法已被删除。@anqe1ki11er我也尝试过。它不起作用。所以,最终实现了解决方案。
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));
this.itemView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
this.itemView.requestLayout();