Mon objet RecyclerView et mon objet ont la largeur match_parent, mais le résultat est le suivant:
<view
class="Android.support.v7.widget.RecyclerView"
Android:layout_width="match_parent"
et articles:
<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"
plein:
<?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>
Dans votre adaptateur où vous gonflez l'élément dans onCreateViewHolder
, le deuxième paramètre de l'appel inflate
appelle-t-il null
?.
Si c'est le cas, remplacez-le par parent
, qui est le premier paramètre de la signature de fonction onCreateViewHolder
.
View rootView = LayoutInflater.from(context).inflate(R.layout.itemLayout, parent, false);
Si vous avez besoin que le second paramètre soit null
, puis, lorsque vous obtenez la référence de vue lors du gonflage, procédez comme suit:
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);
Dans la méthode onCreateViewHolder (...) de l'adaptateur où vous gonflez la vue .. vous devez définir le ViewGroup en tant que parent. Vous obtiendrez ainsi le premier paramètre de la méthode onCreateViewHolder (...).
voir la ligne ci-dessous dans le deuxième paramètre, je passe le ViewGroup. Cela fera automatiquement correspondre la vue à son parent:
rowView=inflater.inflate(R.layout.home_custom_list, parent,false);
/// le code complet est en dessous
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);
essayez ceci lorsque vous définissez les paramètres de disposition pour votre article dans l'adaptateur.
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;
J'avais fait réparer comme ça. Dans mon cas, le problème avec le fichier de mise en page d'activité parce que j'utilise ConstraintLayout en tant que mise en page d'activité principale.
<?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>
J'utilisais un FrameLayout
avec MATCH_PARENT
pour la largeur et je voyais le même comportement avec un RecyclerView
+ LinearLayoutManager
. Aucune des modifications ci-dessus n'a fonctionné pour moi jusqu'à ce que je fasse ce qui suit dans le rappel onCreateViewHolder
:
@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);
}
Cela ressemble clairement à un bug (je suppose) de la mise en œuvre de RecyclerView.
J'ai résolu ceci avec:
myInflatedRowLayout.getLayoutParams().width = vg.getWidth();
Il remplace le MATCH_PARENT
par la largeur réelle du RecyclerView
.
Dans mon cas, le problème était dans la déclaration RecyclerView
XML, le layout_width
était égal à 0dp, ce qui signifie que les contraintes de correspondance, quand je l'ai changé en match_parrent
les éléments ont commencé à remplir tout RecyclerView
width :
<androidx.recyclerview.widget.RecyclerView
Android:id="@+id/recyclerView"
Android:layout_width="0dp" <-- changed this to "match_parrent"
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"/>
Cela a fonctionné pour moi.
remplacez ceci
View view = View.inflate(parent.getContext(), R.layout.row_timeline, null);
return new TimeLineViewHolder(view, viewType);
par ça
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);
Vous ne pouvez pas voir votre code complet, mais vous pouvez deviner que certaines des vues à l'intérieur de votre LinearLayout sont 'wrap_content
'. Vous devez faire en sorte que l’un ou certains d’eux s’étendent sur toute la largeur en utilisant 'Android:layout_weight="1"
'
mise à jour: vous avez beaucoup de layout_weight
redondants. Faites-les tous 'wrap_content
' et pour l'un d'eux, ajoutez layout_weight=1
- pour le dernier CustomTextView. De cette façon, il occupera tout l'espace vide.