在水平recyclerview中显示最多5行的数字

时间:2018-11-12 09:23:08

标签: android android-recyclerview

水平滚动的回收站视图中显示动态数字列表,最多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开始。

修改

现在我拥有的。

enter image description here

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

下面是我的适配器

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 {}
        }
    }
}

1 个答案:

答案 0 :(得分: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) {

        if (position % spanCount == 0) {
            firstRowPos = position;
            holder.txtView.setText(list[position / spanCount]);
        } else {
            if (((position - firstRowPos) * maxColumn + position / spanCount) < list.length)
                holder.txtView.setText(list[(position - firstRowPos) * maxColumn + position / spanCount]);
            else
                holder.txtView.setText("");
        }
    }

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

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

现在假设一个大小为列x行的网格 写下所需的每个单元格中元素的位置(以您的情况为水平),例如下面的

0 1 2 3 4
5 6 7 8

但在回收站视图中的布置将为

0 2 4 6 8
1 3 5 7

从这里开始,您只需要计算公式即可,它是位置,行号,列号的函数

第0行的公式是-所有总行数(跨度大小)的整数倍的位置

对于所有其他行,是

(位置-(从第一行到该列的位置))x列数+从第一行到该列的计算位置 已使用< / em> 填充 第一

样本(基于以上示例) 在适配器的第5个位置,必须坐在数据阵列的第7个位置,所以 (5-4)x 5(列数)+ 2(从所需的第一行开始)= 7

尽管上面的公式给出的值大于数组长度的地方必须要小心

输出屏幕截图 output image