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

时间:2016-03-09 23:00:44

标签: android android-recyclerview

我的RecyclerView及其子项有问题。它们不会延伸到整个android:layout_width="match_parent"fill_parent。我试过了两个。问题是,这项工作完美且没有任何变化,它以某种方式毁了。

我在FragmentDialog中显示此内容,当我向上和向下滚动视图时,子项只会像wrap_content那样展开,它们会完全展开但是只要我点击它们(我打电话) notifyDataSetChanged())他们再次萎缩。

这是一张正确填充项目的图片,下面是加载时或者我发送信息时的状态。我使用的StickHeaderAdapter也没有显示标题,直到我点击其中一个项目(之前的这项工作,我也没有改变任何内容)。

recyclerview child problem

以下是子行的代码:

<?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);并添加Params seperatelly
  • 记录宽度(有时它像390一样,当我滚动它到达990时,当我点击回到390时)
  • 很快设置StickHeaders,但是当它们被创建并且标题存在时它们都已设置,它只是不可见。

任何帮助都得到了赞赏!

4 个答案:

答案 0 :(得分:43)

问题出在新的支持库23.2.0中,所以我将其恢复为23.1.1,它运行正常。如果我找到了解决方案,或者要改变什么,我会告诉你,否则如果其他人找到更好的答案,我就会打开这个主题。

<强>更新

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

问题在于新LayoutManager正在使用autoMeasure()并且以某种方式将我的所有match_parent更改为wrap_content,所以这是您需要做的事情,如果你遇到类似的问题。

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

然后llm.setAutoMeasureEnabled(false);

最后你将LinearLayoutManager设置为RecyclerView,但这样做 AFTER recyclerView.setAdapter(yourAdapter);

这是一个简单的例子:

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

答案 1 :(得分:3)

为了解决这个错误我改变了:

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

使用:

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

答案 2 :(得分:0)

我有同样的问题。它仅在某些视图上发生,并且是可复制的。

由于任何原因,覆盖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

答案 3 :(得分:0)

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