RecyclerView中的项目没有填充它的宽度match_parent

我的RecyclerView及其子项目有问题。 它们没有扩展到整个android:layout_width="match_parent"fill_parent 。 我已经尝试了两个。 事情是,这个工作完美而没有变化,它被破坏了不知何故。

我在一个FragmentDialog显示了这一点,子项目只是展开像wrap_content当我上下滚动视图,他们完全展开,但只要我点击它们(我叫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> 

这里是我创buildViewHolder的适配器代码的一部分:

 @Override public BlockAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.block_row, parent, false); return new ViewHolder(view); } 

这是绑定代码,如果有帮助:

 @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)); } } 

我不知道为什么这个早上工作,后来改变…

我试过的东西:

  • fill_parent更改match_parent
  • RecyclerView.LayoutParams设置为LayoutParams.MATCH_PARENT
  • 以编程方式更改宽度
  • ..., parent, false);更改createViewHolder ..., parent, false); ..., null); 并单独添加Params
  • logging的宽度(有时它就像390,当我滚动它达到990,当我点击回到390)
  • 尽快设置StickHeaders ,但是当它们被创build并且标题在那里时,它们全部被设置,它只是看不见的。

任何帮助感谢!

Related of "RecyclerView中的项目没有填充它的宽度match_parent"

问题是在新的支持库23.2.0 ,所以我恢复到23.1.1 ,它工作正常。 如果我find一个解决scheme,或者改变什么,我会让你知道,否则我会离开这个线程,如果别人find更好的答案。

UPDATE

好的,所以我决定是时候解决这个问题了,因为我们需要迁移到新的支持库,最后我find了答案。

问题是,新的LayoutManager使用autoMeasure()并以某种方式将我的match_parent全部更改为wrap_content ,因此,如果遇到类似问题,则需要执行此操作。

首先创buildLinearLayoutManager llm = new LinearLayoutManager(getActivity());

那么llm.setAutoMeasureEnabled(false);

最后你将LinearLayoutManager设置为你的RecyclerView ,但是在recyclerView.setAdapter(yourAdapter);

这里是一个简单的例子:

 recyclerView.setAdapter(adapter); recyclerView.setHasFixedSize(true); LinearLayoutManager llm = new LinearLayoutManager(getActivity()); llm.setAutoMeasureEnabled(false); recyclerView.setLayoutManager(llm);