match_parent width não funciona no RecyclerView


135

Meu RecyclerView e item têm largura match_parent, mas o resultado é: insira a descrição da imagem aqui

    <view
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"

e itens:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_itm"
android:orientation="horizontal"
android:layout_width="match_parent"

cheio:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_itm"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="100"
android:gravity="right"
>


<Button
    android:layout_width="0dp"
    android:layout_weight="15"
    android:layout_height="fill_parent"
    android:text="ملاحظات"
    android:id="@+id/button" />

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="20"
    android:gravity="center"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <com.getbase.floatingactionbutton.FloatingActionButton
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            fab:fab_plusIconColor="#ff56ff83"
            fab:fab_colorNormal="@color/d_red"
            fab:fab_colorPressed="#ff5c86ff"
            fab:fab_size="mini"
            fab:fab_icon="@drawable/ic_remove_white"
            android:id="@+id/fab_rmv" />
        <esfandune.ir.elmikarbordiardakan.other.CustomTxtView
            android:layout_weight="25"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="0"
            android:gravity="right|center_vertical"
            android:id="@+id/txt_takhir_itm" />
        <com.getbase.floatingactionbutton.FloatingActionButton
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            fab:fab_plusIconColor="@color/colorprimarylight"
            fab:fab_colorNormal="@color/colorprimarydark"
            fab:fab_colorPressed="@color/colorprimary"
            fab:fab_size="mini"
            fab:fab_icon="@drawable/ic_add_white"
            android:id="@+id/fab_add" />

    </LinearLayout>
</LinearLayout>
    <Spinner
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="10"
        android:id="@+id/sp_nomre_itm"

        android:entries="@array/degrees"/>


<LinearLayout
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="10"
    android:gravity="center"
    >
    <!--LinearLayout baraye ine ke nameshod fab ro weight behosh dad-->
    <com.getbase.floatingactionbutton.FloatingActionButton
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        fab:fab_plusIconColor="#ff56ff83"
        fab:fab_colorNormal="@color/d_green"
        fab:fab_colorPressed="@color/d_orange"
        fab:fab_size="normal"
        fab:fab_icon="@drawable/ic_done_white"
        android:id="@+id/fab_hazr" />



</LinearLayout>
<esfandune.ir.elmikarbordiardakan.other.CustomTxtView
    android:layout_weight="5"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="100"
    android:gravity="right|center_vertical"
    android:id="@+id/txt_ghybtNumber_itm" />

<esfandune.ir.elmikarbordiardakan.other.CustomTxtView
        android:layout_weight="30"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="عباسعلی ملاحسینی اردکانی"
        android:gravity="right|center_vertical"
        android:id="@+id/txt_title_itm"
    android:layout_marginRight="10dp"
    />

<view
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="10"
    class="de.hdodenhof.circleimageview.CircleImageView"
    android:id="@+id/view"
    android:src="@drawable/mmrdf"
   />
</LinearLayout>

Respostas:


433

No seu adaptador em que você está inflando o item onCreateViewHolder, é o segundo parâmetro da inflatechamada null?

Nesse caso, altere para parentqual é o primeiro parâmetro na onCreateViewHolderassinatura da função.

View rootView = LayoutInflater.from(context).inflate(R.layout.itemLayout, parent, false);

Se você precisar que o segundo parâmetro seja null, ao obter a referência de exibição sobre inflar, faça o seguinte

View rootView = LayoutInflater.from(context).inflate(R.layout.itemLayout, null, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
rootView.setLayoutParams(lp);
return new RecyclerViewHolder(rootView);

1
Não funciona para mim: se eu definir meu rootView do item como width = "match_parent", mas "funcionará" se eu definir para 500dp, por exemplo. Qualquer ideia ? OK, ele não funciona com um LinearLayout, mas funciona com um relatedLayout no item ... wtf?
Cocorico

5
Sry, como funciona com o RelayLayout, apenas altero LinearLayout para RelativeLayout. Mas o RecyclerView era match_parent e o item rootView (portanto, o LinearLayout) também era Match_parent e não funcionava. Primeira vez que enfrentei isso.
Cocorico

1
Oh, ótimo, isso funciona ... depois de puxar meu cabelo por uma hora.
Zhi Kai

4
Sim, como mencionado anteriormente, por algum motivo, isso não funcionou com um LinearLayout e alterná-lo para um RelativeLayout com essa correção pareceu funcionar.
Nick Pimentas

11
Isso não funciona com Linearlayout ou Constrainlayout. Eu tive que mudar para RelativeLayout e, em seguida, ele trabalhou
ymerdrengene

18

Dentro do método onCreateViewHolder (...) do adaptador no qual você está inflando a exibição ... você precisa definir o ViewGroup como o pai. Você obterá o primeiro parâmetro do método onCreateViewHolder (...).

veja a linha abaixo no segundo parâmetro que eu estou passando o ViewGroup. Isso corresponderá automaticamente a visualização ao seu pai:

rowView=inflater.inflate(R.layout.home_custom_list, parent,false);

/// o código completo está abaixo

public View onCreateViewHolder(ViewGroup parent, int position) {
    // TODO Auto-generated method stub
    View rowView;
        LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView=inflater.inflate(R.layout.home_custom_list, parent,false);

8

Eu estava usando um FrameLayoutcom MATCH_PARENTpara largura e estava vendo o mesmo comportamento com um RecyclerView+ LinearLayoutManager. Nenhuma das alterações acima funcionou para mim até que eu fiz o seguinte no onCreateViewHolderretorno de chamada:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
                           .inflate(R.layout.note_layout, parent, false);
    v.setLayoutParams(new RecyclerView.LayoutParams(
          ((RecyclerView) parent).getLayoutManager().getWidth(),
          context.getResources()
                 .getDimensionPixelSize(R.dimen.note_item_height)));

    return new ViewHolder(v);
}

Parece claramente um bug na implementação do RecyclerView.


Substituindo o layoutParams foi a única solução que me ajudou. Alguém sabe se isso é um bug no RecyclerView? Ficaria grato por um link para o rastreador de erros do Google.
soshial

5

tente isso ao definir parâmetros de layout para o item no adaptador.

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 ViewOffersHolder viewOffersHolder = new ViewOffersHolder(viewHolder);
 return viewOffersHolder;

5

Eu tinha corrigido assim. No meu caso, problema com o arquivo de layout de atividade, porque eu estou usando ConstraintLayout como layout de atividade raiz. Pode ser o caso também.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolBar"
        layout="@layout/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/accent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolBar" />
</android.support.constraint.ConstraintLayout>

2
É difícil de acreditar, mas apenas substituindo meu redor ConstraintLayout com um LinearLayout resolvido isso por mim também ...
FJC

match_parent não deve ser usado para filhos diretos de ConstraintLayout. Em vez disso, use 0dp com os atributos constraintLeft / Right / Bottom / Top.
DoruAdryan

3

No meu caso, o problema estava na RecyclerViewdeclaração XML, layout_widthera 0dp, o que significa match_constraints, quando eu mudei para match_parent, os itens começaram a preencher toda a RecyclerViewlargura:

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"  <-- changed this to "match_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="45dp"
            android:background="@android:color/transparent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHeight_default="wrap"
            app:layout_constraintHeight_max="360dp"
            app:layout_constraintHeight_min="60dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/header"/>

2

Eu resolvi isso com:

 myInflatedRowLayout.getLayoutParams().width = vg.getWidth();

Ele está substituindo o MATCH_PARENTpela largura real do RecyclerView.


1

Isso funcionou para mim.

substitua isso

   View view = View.inflate(parent.getContext(), R.layout.row_timeline, null);
   return new TimeLineViewHolder(view, viewType);

por este

 View rootView = LayoutInflater.from(context).inflate(R.layout.row_timeline, null, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        rootView.setLayoutParams(lp);
        return new TimeLineViewHolder(rootView, viewType);

0

Não é possível ver seu código completo, mas pode-se adivinhar que algumas das visualizações dentro do LinearLayout são ' wrap_content'. Você precisa fazer com que um ou alguns deles se expandam para toda a largura usando ' android:layout_weight="1"'

atualização: você tem muitos redundantes layout_weight. Crie todos eles ' wrap_content' e, para apenas um deles, adicione layout_weight=1- para o último CustomTextView. Dessa forma, ele ocupará todo o espaço em branco.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.