牙叔教程 简单易学
使用场景
listView中有单选按钮的时候, 需要记住单选按钮的勾选状态,
在测试list的时候, 如果list绑定的数据多了之后, 我们在滑动上下几次之后
单选按钮的勾选状态就不正确了
本来是勾选的, 变成了不勾选
本来是不勾选的, 变成了勾选
autojs版本
8.7.7-0
事出有因
导致这个错误的原因是list的回收复用,
当控件从可见到不可见, 再从不可见到可见的时候,
会重新给控件绑定数据
就这绑定数据这一步发成了错误
解决办法
绑定数据这一步需要重写,
我们不适用list,
而是使用原生的RecyclerView
详细的类名 androidx.recyclerview.widget.RecyclerView
代码讲解
1. 导入类
importClass(Packages.androidx.recyclerview.widget.RecyclerView); importClass(Packages.androidx.recyclerview.widget.LinearLayoutManager);
2. 布局
ui.layout( <vertical> <vertical> <text textSize="30sp" w="*" gravity="center" textStyle="bold"> 牙叔教程 简单易学 </text> <button id="addUser">创建新房间</button> <button id="showData">显示房间数据</button> <androidx.recyclerview.widget.RecyclerView id="roomList" h="*" w="*" /> </vertical> </vertical> );
3. recycleView子控件视图
let boxXml = ( <vertical w="*" padding="8" margin="50"> <radiogroup id="roomList" orientation="horizontal"> <radio text="房间1号"></radio> <radio text="房间2号"></radio> </radiogroup> <text id="time"></text> </vertical> );
4. 创建adapter
function createGiftBoxAdapter(roomList) { return RecyclerView.Adapter({ onCreateViewHolder: function (parent, viewType) { log("onCreateViewHolder"); // 视图创建 let view; let holder; view = ui.inflate(boxXml, parent, false); holder = JavaAdapter(RecyclerView.ViewHolder, {}, view); view.time.click(function () { toastLog(view.time.text()); }); view.roomList.setOnCheckedChangeListener({ onCheckedChanged: function (radioGroup, checkedId) { let checkView = view.findViewById(checkedId); let room = roomList[holder.getPosition()]; if (!checkView.isPressed()) { //没有被点击 if (room.name) { if (holder.itemView.roomList.getChildAt(0).getText().toString() === room.name) { holder.itemView.roomList.getChildAt(0).checked = true; } else if (holder.itemView.roomList.getChildAt(1).getText().toString() === room.name) { holder.itemView.roomList.getChildAt(1).checked = true; } } else { holder.itemView.roomList.getChildAt(0).checked = false; holder.itemView.roomList.getChildAt(1).checked = false; } return true; } if (checkView.checked) { room.name = checkView.getText().toString(); toastLog("选中了" + room.name); log(room); log(roomList); } else { toastLog("没选中"); room.name = ""; } }, }); return holder; }, onBindViewHolder: function (holder, position) { log("onBindViewHolder"); // 数据绑定 let room = roomList[position]; holder.itemView.time.setText(room.time); if (room.name) { if (holder.itemView.roomList.getChildAt(0).getText().toString() === room.name) { holder.itemView.roomList.getChildAt(0).checked = true; } else if (holder.itemView.roomList.getChildAt(1).getText().toString() === room.name) { holder.itemView.roomList.getChildAt(1).checked = true; } } else { holder.itemView.roomList.getChildAt(0).checked = false; holder.itemView.roomList.getChildAt(1).checked = false; } }, getItemCount: function () { return roomList.length; }, }); }
5. 给recycleView设置adapter
//设置Adapter recycleAdapter = createGiftBoxAdapter(roomList); recyclerView.setAdapter(recycleAdapter);
6. 添加房间
function addRoom() { log(arguments.callee.name); roomList.push(formatRoomInfo()); ui.roomList.post(function () { ui.roomList.smoothScrollToPosition(roomList.length); }); recycleAdapter.notifyDataSetChanged(); }
7. 格式化房间信息
function addRoom() { log(arguments.callee.name); roomList.push(formatRoomInfo()); ui.roomList.post(function () { ui.roomList.smoothScrollToPosition(roomList.length); }); recycleAdapter.notifyDataSetChanged(); }
8. 控件随机背景色
function getRndColor() { let color = new java.util.Random(); return colors.toString((randomColor = colors.rgb(color.nextInt(256), color.nextInt(256), color.nextInt(256)))); }
参考文章
此处为语雀内容卡片,点击链接查看:https://www.yuque.com/go/doc/31211497
声明
部分内容来自网络