Recyclerview Проблемы горизонтального пролета и расстояния

1

Итак, это то, что я пытаюсь достичь, - это просмотр ресайклера с сеткой 3x3, и когда элементы превышают 3x3, они попадают в следующий экран/страницу.

Итак, я использовал recyclerview с горизонтальной прокруткой

Это то, что достигнуто до сих пор.

Изображение 174551

и мой текущий код работает, когда количество элементов равно 7 и выше.

Когда число ниже 7 im сталкивается с проблемами, с которыми мне нужна помощь.

Вводя мои вопросы в качестве вопросов

Вопрос 1:

Почему элементы recyclerview заполняются вертикально?

1 4
2 5
3 6

Я установил свой recyclerview для прокрутки по горизонтали,

new GridLayoutManager(this, span, GridLayoutManager.HORIZONTAL, false);

Вопрос 2:

Когда мой счетчик элементов равен 6, как мне избежать пространства между строками?

Изображение 174551

Вопрос 3:

Когда мои вещи говорят 4, я хочу показать свои предметы как

1 2 3
4

или

1 3 4
2

в настоящее время он отображается как

Изображение 174551

Если я устанавливаю интервал в 1, у него есть сетка как

1 2 3 4

заставляет 4 выходить за пределы экрана таким образом

1 2 3 |4

который я хочу избежать.

==============

Используемый код ive

Разметка:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="88dp"
    android:layout_height="88dp"
    android:gravity="center"
    android:layout_margin="10dp"
    android:background="@drawable/border"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:background="@android:color/darker_gray"
        android:orientation="vertical"
        android:weightSum="1">

        <TextView
            android:id="@+id/lblTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="TEST"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/lblDesc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/lblTitle"
            android:layout_centerHorizontal="true"
            android:text="TEST"
            android:textSize="13sp" />
    </RelativeLayout>
</LinearLayout>

Adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.CustomViewHolder> {
    Context ctx;
    List<String> listText;

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        TextView lblText;

        public CustomViewHolder(View view) {
            super(view);
            view.setClickable(true);
            lblText = (TextView) view.findViewById(R.id.lblDesc);
        }
    }

    public RecyclerViewAdapter(Context ctx, List<String> listText) {
        this.ctx = ctx;
        this.listText = listText;
    }

    @Override
    public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_child_row, parent, false);
        return new CustomViewHolder(itemView);
    }


    @Override
    public void onBindViewHolder(CustomViewHolder holder, int position) {
        holder.lblText.setText(listText.get(position));
    }


    @Override
    public int getItemCount() {
        return listText.size();
    }
}

Деятельность

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerTest;
    private GridLayoutManager gridLayoutRecyclerview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerTest = (RecyclerView) findViewById(R.id.recyclerTest);
        List<String> items = Arrays.asList("1", "2", "3", "4");
        /*List<String> items = Arrays.asList("1", "2", "3", "4", "5");*/
        /*List<String> items = Arrays.asList("1", "2", "3", "4", "5", "6", "7");*/
        /*List<String> items = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11");*/
        /*List<String> items = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13","14");*/
        /*List<String> items = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11","12","13","14","15");*/
         /*List<String> items = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11","12","13","14","15","16","17");*/    

        int span = 0;    
        if (items.size() <= 3) {
            span = 1;
        } else if (items.size() <= 6) {
            span = 2;
        } else {
            span = 3;
        }

        gridLayoutRecyclerview = new GridLayoutManager(this, span, GridLayoutManager.HORIZONTAL, false);

        recyclerTest.setLayoutManager(gridLayoutRecyclerview);

        SnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
        snapHelper.attachToRecyclerView(recyclerTest);

        recyclerTest.setAdapter(new RecyclerViewAdapter(this, items));
    }
}
Теги:
android-recyclerview

1 ответ

1
Лучший ответ

Почему элементы recyclerview заполняются вертикально?

1 4
2 5
3 6

A RecyclerView предназначен для списков, которые прокручиваются. Если у вас горизонтальный макет, он заполнит первый столбец, затем второй, затем третий и т.д. В конце концов, как мы ожидаем, что список будет работать. И вот почему "нумерация выключена". Он начинается с первого столбца, переходя к следующему после его заполнения.

Когда мой счетчик элементов равен 6, как мне избежать пространства между строками?

Я не знаю вашу настройку, но я предполагаю, что высота recyclerviews установлена ​​на match_parent, поэтому она, вероятно, просто использует всю доступную высоту. wrap_content высота для recyclerview может помочь.

Когда мои вещи говорят 4, я хочу показать свои предметы как

1 2 3
4

или

1 3 4
2

Опять же, см. выше, что не работает RecyclerView. Он всегда будет заполнять столбцы один за другим, а не начинаться с строки. 4 Элементы с числом столбцов 2 всегда будут заполнять первые столбцы, как показано ниже.

1 3
2 4

RecyclerView может не соответствовать всем вашим потребностям. Вы можете переключиться на макет сетки вертикальный с 3 столбцами с менее чем 9 элементами. Таким образом, он не будет прокручиваться горизонтально, и он даже заполнит взгляды, как вы описали. Для более чем 9 элементов вы все равно будете показывать горизонтальную версию и прокрутите ее.

То, что вы на самом деле описываете, - это настраиваемый макет: вам нужно представление, которое ведет себя определенным образом. Вы могли бы посмотреть, как создать свой собственный ViewGroup и использовать это, чтобы выложить все виды, как вам нравится. Если вы не хотите показывать длинные списки, это может быть хорошим альтернативным вариантом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню