Android - GridLayoutManager - Загружать элементы в списке по вертикали? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть список, скажем, 20 пунктов.Я хочу иметь возможность загружать их вот так

1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20

Я использую RecyclerView с GridLayoutManager Используя GridLayoutManager(context, 2), он загружает элементы следующим образом

1 2
3 4
5 6
7 8
....

Что не является моим желаемым результатом

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы можете реализовать логику следующим образом.Будет работать плавно

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, pos: Int) {
            var arraySize = 21
            var half = 0
            if (array % 2 == 0)
                half = array % 2
            else half = (array % 2 + 0.5).toInt()
            if (pos  % 2 == 0)
                print(pos)
            else print(half + pos)
        }
0 голосов
/ 26 февраля 2019

Самый простой способ добиться этого - отсортировать ArrayList в соответствии с требуемым порядком, передать свой массив в функцию remarangeTheArrayList , получить новый ArrayList и передать его в Adapter view Adapter для достижения вышеупомянутого порядка..

 public ArrayList<Integer> rearrangeTheArrayList(ArrayList<Integer> integerArrayList) {
    ArrayList<Integer> resultArrayList = new ArrayList<>();
    int halfLength = 0;
    if (integerArrayList.size() % 2 == 1) {
        halfLength = (integerArrayList.size() / 2) + 1;
    } else {
        halfLength = integerArrayList.size() / 2;
    }

    for (int i = 0; i < halfLength; i++) {
        resultArrayList.add(integerArrayList.get(i));
        if ( (i + halfLength)<(integerArrayList.size() )) {
            resultArrayList.add(integerArrayList.get(i + halfLength));
        }
    }
    return resultArrayList;
}
0 голосов
/ 26 февраля 2019

GridLayoutManager всегда учит RecyclerView рисовать слева направо и сверху вниз.Масштаб по умолчанию для этого вида является вертикальным (или горизонтальным).Он не может рассчитать, сколько строк должно отображаться в этом динамическом случае.У меня есть решение для вас.Однако не следует придерживаться этой бизнес-логики.

Все, что вам нужно, - это один адаптер с двумя типами представлений и простая логика для индексации нужной вещи.Код образца:

public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> {
    private final Context context;
    private List<Integer> listLeft;
    private List<Integer> listRight;

    public SampleAdapter (Context context) {
        this.context = context;
    }

    public void setListLeft(List<Integer> list) {
        this.listLeft = list;
    }

    public void setListRight(List<Integer> list) {
        this.listRight = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.sample, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        int index = position / 2; // assumes there are two lists of equal lengths
        int viewType = getItemViewType(position);
        if (viewType == TYPE_1) {
            holder.textView.setText(listLeft.get(index).toString());
        } else if (viewType == TYPE_2) {
            holder.textView.setText(listRight.get(index).toString());
        }
    }

    @Override
    public int getItemCount() {
        return listLeft.size() + listRight.size();
    }

    @Override
    public int getItemViewType(int position) {
        return position % 2 == 0 ? VIEW_TYPE_1 : VIEW_TYPE_2;
    }
}

Draw order

...