【问题标题】:Item in RecyclerView not filling it's width match_parentRecyclerView 中的项目未填充其宽度 match_parent
【发布时间】:2016-06-24 14:01:34
【问题描述】:

我的RecyclerView 及其子项有问题。它们不会延伸到整个 android:layout_width="match_parent"fill_parent。我都试过了。问题是,这项工作完美无缺,没有任何改变,不知怎的就毁了。

我在FragmentDialog 中显示此内容,当我上下滚动视图时,子项仅像wrap_content 一样展开,它们已完全展开,但只要我点击它们(我打电话给notifyDataSetChanged())它们又缩小了。

这是一个正确填充的项目的图片,下面是它们在加载或我 notifyData 时的状态。此外,我使用的 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>

这是我创建ViewHolder的适配器代码部分:

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

}

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

我尝试过的事情:

  • match_parent 更改为fill_parent
  • RecyclerView.LayoutParams 设置为LayoutParams.MATCH_PARENT
  • 以编程方式更改宽度
  • 将 createViewHolder 从 ..., parent, false); 更改为 ..., null); 并单独添加参数
  • 记录宽度(有时它像 390,当我滚动到 990 时,当我点击返回到 390 时)
  • 尽快设置StickHeaders,但它们在创建时都已设置,并且标头在那里,只是不可见。

感谢任何帮助!

【问题讨论】:

  • 您是否尝试过使用普通 LinearLayout?我不知道carbon.widget.LinearLayout 是什么或它的作用
  • 它只是为点击项目添加涟漪效果。它以前曾与之合作过:/
  • 它会进行一些自定义测量,所以我不会完全相信这一点。您应该尝试它是否适用于正常布局。
  • 我试过了,也不能正常使用

标签: android android-recyclerview


【解决方案1】:

问题出在新的支持库23.2.0 中,所以我将其恢复为23.1.1,它工作正常。如果我找到解决方案或要更改的内容,我会通知您,否则我将打开此线程,如果其他人找到更好的答案。

更新

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

问题是/是新的LayoutManager 正在使用autoMeasure() 并且不知何故将我所有的match_parent 更改为wrap_content,所以如果您遇到类似的问题,这就是您需要做的。

首先创建LinearLayoutManager 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);

【讨论】:

  • 我觉得这些 .setLayoutManager().setAdapter() 排序错误的存在有点荒谬
  • 这对我有用,谢谢。我使用的是 RecyclerView 25.2.0,我首先设置了布局管理器,然后设置了 setAutoMeasureEnabled(false),然后是工作的适配器
  • 有效,我在setAdapter 之前设置setAutoMeasureEnabled 也有效。我的RecyclerView 版本是v26.1.0
  • 从 API v27.1.0 开始,我们需要扩展 LinearLayoutManager 并重写 isAutoMeasureEnabled() 函数以返回 false,因为 setAutoMeasureEnabled() 方法已被移除。
  • @anqe1ki11er 我也试过了。它不工作。所以,最终实现了this 解决方案。
【解决方案2】:

为了解决这个错误,我更改了:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity());

与:

recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));

【讨论】:

    【解决方案3】:

    将您的回收视图依赖项更新到最新的.. 能够摆脱这种情况.. - 我更新到 1.3.0

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。它只发生在某些视图中,并且是可重现的。

      无论出于何种原因,覆盖 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

      【讨论】:

        【解决方案5】:

        我也遇到了这个问题。我能够通过避免使用“MATCH_PARENT”作为宽度来解决它,而是将 layout_constraintStart_toStartOf 和 layout_constraintEnd_toEndOf 设置为“0”,并将宽度设置为匹配约束。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-15
          • 1970-01-01
          • 2022-11-22
          相关资源
          最近更新 更多