0

在最多 5 行的水平滚动回收器视图中显示数字的动态列表。数字大小取决于当前周数。如果当前周数是 45,那么将有 45 个项目。我可以用GridLayoutManager.

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

<----------->

但我希望它们如下所示(水平增加)

1   2   3   4   5

6   7   8   9  10

11 12  13  14  15

16 17  18  19  20

21 22  23  24  24

<--------------->

这里只是为了简单起见,我从 1 开始编号。在实际应用程序中,编号可以从 100 或 1000 开始。

编辑

现在我所拥有的。

在此处输入图像描述

如您所见,数字垂直减少。我希望它们水平减少。

下面是我的适配器

class SINumberAdapter(val context: Context, val list:List<String>): RecyclerView.Adapter<SINumberAdapter.NumberViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumberViewHolder {

        val textView = TextView(parent.context)
        textView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT)
        val paddingInPixels = 5.toPx
        textView.setPadding(paddingInPixels, paddingInPixels, paddingInPixels, paddingInPixels)
        return NumberViewHolder(textView)
    }

    override fun getItemCount() = list.size

    override fun onBindViewHolder(holder: NumberViewHolder, position: Int) {
        holder.view.text = list[position]
    }

    inner class NumberViewHolder(val view:TextView):RecyclerView.ViewHolder(view){
        init {
            view.setOnClickListener {}
        }
    }
}
4

1 回答 1

1

编辑后的答案

假设最大列大小是固定的或在设置适配器之前已知。

遵循全局声明

int maxColumn = 8;
int spanCount = 1;
String list[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
        "14", "15", "16", "17", "18", "19", "20"};

在 onCreate 里面

spanCount = list.length / maxColumn + 1;

mGridLayoutManager = new GridLayoutManager(mContext, spanCount, GridLayoutManager.HORIZONTAL, false);

上面我计算了给定长度的数组和列数所需的跨度大小

示例适配器代码

private class MyAdapter extends RecyclerView.Adapter<MyHolder> {

    int firstRowPos = 0;

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row_item, null));
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {

        int adapterColumn = position / spanCount;
        int adapterRow = position - adapterColumn * spanCount;

        int calcPos = maxColumn * adapterRow + adapterColumn;

        if (calcPos < list.length)
            holder.txtView.setText(list[calcPos]);
        else
            holder.txtView.setText("");
    }

    @Override
    public int getItemCount() {
        return spanCount * maxColumn;
    }
}

在适配器中,总计数作为列数和行数的乘积返回(计算的跨度大小)

现在假设一个大小为 column x row 的网格根据需要写下每个单元格中元素的位置(在您的情况下水平移动),例如下面

req
0  1  2  3  4  5  6
7  8  9  10 11 12 13
14 15

但回收站视图中的安排将是

curr
0  3  6  9  12  15
1  4  7  10 13
2  5  8  11 14

从这里你只需要找出公式,它将是位置、行号、列号的函数

但必须注意上述公式给出的值超过数组长度的地方

输出屏幕截图 输出图像

于 2018-11-12T11:08:17.103 回答