android android-layout android-recyclerview android-flexboxlayout

android - Centrar los elementos de RecyclerView con FlexboxLayoutManager



android-layout android-recyclerview (2)

¿Cómo centro todos mis artículos RecyclerView usando FlexboxLayoutManager ? Necesito que los artículos estén centrados así:

Lo intenté sin éxito:

Mi código donde configuro el gestor de diseño:

val layoutManager = FlexboxLayoutManager(this) layoutManager.setFlexWrap(FlexWrap.WRAP) layoutManager.setFlexDirection(FlexDirection.ROW) layoutManager.setJustifyContent(JustifyContent.FLEX_START) layoutManager.setAlignItems(AlignItems.FLEX_START) val adapter = TagAdapter(tags) tagRecyclerView.adapter = adapter tagRecyclerView.layoutManager = layoutManager

(Intenté establecer layoutManager.setAlignItems(AlignItems.FLEX_START ) en layoutManager.setAlignItems(AlignItems.CENTER) sin embargo, no funcionó ...


Prueba esto

Codigo de actividad

public class TestActivity extends AppCompatActivity { RecyclerView recyclerView; ArrayList<String> arrayList = new ArrayList<>(); FlexboxAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); recyclerView = findViewById(R.id.recyclerView); initArray(); FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(this); layoutManager.setFlexDirection(FlexDirection.ROW); layoutManager.setJustifyContent(JustifyContent.CENTER); layoutManager.setAlignItems(AlignItems.CENTER); recyclerView.setLayoutManager(layoutManager); adapter = new FlexboxAdapter(this, arrayList); recyclerView.setAdapter(adapter); } private void initArray() { arrayList.add("Nileshfgfdgfdgfdggfgfgfdgvcb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nileshfgfdgfdgfdggfgcvbcvb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nileshfgfdgfdgfdggfgfdgdfgcvb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nileshfgfdgfdgfdggfgcvb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nileshfgfdgfdgfdggfgdfgdfgcvb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); arrayList.add("Nileshfgfdgfdgfdggfgdfgcvb"); arrayList.add("Nilesh"); arrayList.add("Nilesh"); } }

CÓDIGO ADAPTADOR

public class FlexboxAdapter extends RecyclerView.Adapter<FlexboxAdapter.ViewHolder> { Context context; ArrayList<String> arrayList = new ArrayList<>(); public FlexboxAdapter(Context context, ArrayList<String> arrayList) { this.context = context; this.arrayList = arrayList; } @Override public FlexboxAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.custom_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(FlexboxAdapter.ViewHolder holder, int position) { holder.title.setText(arrayList.get(position)); } @Override public int getItemCount() { return arrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView title; public ViewHolder(View itemView) { super(itemView); title = itemView.findViewById(R.id.tvTitle); } } }

Diseño personalizado

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:padding="5dp" android:text="Nilesh" android:textColor="#000" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout>

Diseño de la actividad

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".TestActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>

SALIDA


Respuesta corta

Está utilizando layoutManager.setAlignItems(AlignItems.FLEX_START) . Esto está causando la alineación de inicio.

Debe utilizar una de las dos alineaciones que se ajustan a sus necesidades.

layoutManager.setAlignItems(AlignItems.CENTER) .

o

layoutManager.setAlignItems(AlignItems.SPACE_AROUND) .

Nota:

Porque dijiste esto

@MarcEstrada si, no funciona

Mantener el ancho de la disposición del elemento wrap_content . (todo hijo con padre debe tener wrap_content ancho de wrap_content .) como android:layout_width="wrap_content"

Si usa el ancho match_parent entonces no obtendrá elementos centrados.