在水平滚动的回收站视图中显示动态数字列表,最多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 {}
}
}
}
答案 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
尽管上面的公式给出的值大于数组长度的地方必须要小心