listView记忆功能

简介: 牙叔教程 简单易学

牙叔教程 简单易学


使用场景

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


声明

部分内容来自网络

相关文章
|
5月前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
5月前
|
XML 前端开发 Java
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
214 0
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
246 0
|
Android开发 开发者 存储
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二)
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二) 如今Android这种可收缩伸展的Expandable RecyclerView是如此常用,在附录1的基础上,我重新把模型进行了抽象和封装,设计了一套新的架构和简洁的使用方式支持这种功能。
3751 0
|
2月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
5月前
|
存储 缓存 Android开发
构建高效的Android应用:采用RecyclerView优化列表显示
【4月更文挑战第2天】 在移动开发领域,列表显示是最常见的用户界面组件之一。对于Android平台而言,RecyclerView因其高效、灵活的特点而备受开发者青睐。本文将深入探讨如何利用RecyclerView在Android应用中实现流畅的列表滚动,以及通过各种优化策略来提升性能和用户体验。我们将从基本概念出发,逐步展开如何自定义适配器、视图持有者,以及利用布局管理器来实现复杂的列表布局。此外,还将讨论如何通过异步加载、缓存机制和动态数据更新来进一步优化性能。
88 1
|
5月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
123 3
|
5月前
|
XML Java Android开发
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
241 0
|
XML 存储 Android开发
ListView的“终极优化”,打造你的万能适配器
传统的代码逻辑我们是怎么使用的呢?每写一个ListView,都要去写一个Adapter类,一个ViewHolder类,这几乎是我们必须要操作的,以致于有太多太多的冗余代码,让我们感到真的不厌其烦,一个两个还可以,十个八个,就真的有点太崩溃了,不仅代码繁琐,还会占用内存,为了解决这样的一个问题,下面就要开始对其抽取优化。
|
XML SQL 缓存
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
273 0
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记