Как автоматически определить количество элементов для сетки RecyclerView - PullRequest
0 голосов
/ 17 сентября 2018

Можно ли использовать указанную ширину (100 дп), чтобы равномерно распределить элементы в сетке (как можно больше) для RecyclerView, а не использовать точное количество столбцов?int numberOfColumns = 3;, int numberOfColumns = 4; и т. Д. Не будут выполнять эту работу, поскольку это приведет к появлению большого количества свободного места на больших экранах.

книжная ориентация

enter image description here

альбомная ориентация

enter image description here

RecyclerView, связанных скод во фрагменте

                static final String[] frenchVowels = new String[]{
                    "a", "e", "i", "o", "u", "y"
                };

                RecyclerViewAdapter rvAdapterGL;
                final RecyclerView rvGL = viewHolder.itemView.findViewById(R.id.rv);
                int numberOfColumns = 2;
                rvGL.setLayoutManager(new GridLayoutManager(getActivity(), numberOfColumns));
                rvAdapterGL = new RecyclerViewAdapter(getActivity(), frenchVowels);
                rvGL.setAdapter(rvAdapterGL);

Класс адаптера RecyclerView

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private String[] mData;
    private LayoutInflater mInflater;

    // data is passed into the constructor
    public RecyclerViewAdapter(Context context, String[] data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    // inflates the cell layout from xml when needed
    @Override
    @NonNull
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.gridview_item, parent, false);
        return new RecyclerViewAdapter.ViewHolder(view);
    }

    // binds the data to the TextView in each cell
    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.ViewHolder holder, int position) {
        holder.myTextView.setText(mData[position]);
    }

    // total number of cells
    @Override
    public int getItemCount() {
        return mData.length;
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.item_gridview);
        }
    }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true"
    android:id="@+id/cv_gv"
    android:layout_marginBottom="20dp"
    >

    <LinearLayout
        android:id="@+id/cardview_gv_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp"
        android:animateLayoutChanges="true">

        <LinearLayout
            android:id="@+id/cardview_gv_titlerow"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginBottom="2dp"
            android:weightSum="100">

            <TextView
                android:id="@+id/tv_gv_A"
                android:layout_weight="90"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textColor="?android:attr/textColorPrimary"
                style="@android:style/TextAppearance.Medium" />

            <TextView
                android:id="@+id/tv_gv_expandcollapse"
                android:importantForAccessibility="no"
                android:clickable="true"
                android:focusable="true"
                android:layout_weight="10"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:textColor="?android:attr/textColorPrimary"
                style="@android:style/TextAppearance.Large" />
        </LinearLayout>

        <RelativeLayout
            android:id="@+id/relativelayout_gv"
            android:animateLayoutChanges="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <GridView
                android:id="@+id/gv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:columnWidth="100dp"
                android:numColumns="auto_fit"
                android:layout_marginBottom="20dp"
                android:stretchMode="columnWidth" />
        </RelativeLayout>

    </LinearLayout>
</android.support.v7.widget.CardView>

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Если вы используете макет GridView, ответ на этот вопрос здесь .

Или, если вы хотите использовать GridLayoutManager, сделайте это следующим образом

if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
}
else{
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
0 голосов
/ 17 сентября 2018

Вы должны использовать библиотеку flexbox-layout .Это дизайн библиотеки с открытым исходным кодом от Google, который будет автоматически устанавливать количество столбцов на основе ширины строки. Вам не нужно указывать количество столбцов.

И его использование также просто:

RecyclerView recyclerView = (RecyclerView) context.findViewById(R.id.recyclerview);
FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);

Gradle:

dependencies {
    implementation 'com.google.android:flexbox:1.0.0'
}
0 голосов
/ 17 сентября 2018

Есть несколько способов справиться с этим.Одна вещь, которую вы могли бы сделать, это получить ширину экрана и разделить ее на желаемую ширину ячейки, чтобы получить количество столбцов.

Вы также можете использовать инфраструктуру ресурсов для установки различного количества столбцов для разных размеров экрана.Например, у вас может быть res/values/integers.xml, который устанавливает количество столбцов на 3, а также res/values-sw400dp/integers.xml, который устанавливает количество столбцов на 5 и т. Д.

res / values ​​/ inteers.xml

<resources>
    <integer name=“column_count”>3</integer>
</resources>

res / values-sw400dp / inteers.xml

<resources>
    <integer name=“column_count”>5</integer>
</resources>

Теперь вы можете заменить

int numberOfColumns = 2;

на

int numberOfColumns = getResources().getInteger(R.integer.column_count);

И вы можете использовать любое количество values-swXXXdp/integers.xml файлов с множеством различных значений для XXX, чтобы иметь много разных столбцов для множества разных размеров экрана.

...