【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)

news2025/1/13 3:38:00

文章目录

    • 一、引言
    • 二、解决方案
      • 1、需求一
      • 2、需求二
        • (1)普通方法
        • (2)观察者模式(推荐)

一、引言

  • 描述:如何在主线程(Activity/Fragment)UI中修改子线程(Adapter)的内容
  • 难度:初级
  • 知识点:
    1、Adapter适配器
    2、ViewModel观察者模式
  • 需求:
    1、点击List列表更新Adapter(例)
    在这里插入图片描述
    2、局外UI添加数据(例)
    在这里插入图片描述

二、解决方案

有些初学者看了有点懵,就需要先将同栏目下的Adapter三种常见的适配器熟悉一遍。

1、需求一

	// 主线程获取到的数据
	List<Data> list;
	// 触发点击事件的方法
	@NonNull
    @Override
	public Adapter.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter,parent,false);
        final FileAdapter.ViewHolder holder = new FileAdapter.ViewHolder(view);
        // 点击事件
        holder.fileView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取到当前列的数据
                int position = holder.getAdapterPosition();
                Data data = listUFile.get(position);    // 点击值
                // -----以下步骤为如何通过data获取更新的数据,我就不写了----
                List<Data> nowList = nowListData(data);  // nowListData为获取新数据的方法
                // --------------------------------------------------------
                // 更替数据
                list = new ArrayList<>();
                list.addAll(nowList);
                notifyDataSetChanged();
            }
        });
        return holder;
    }

2、需求二

(1)普通方法

  • 第一步,在Adapter中定义一个方法
	// 主线程获取到的数据
	List<Data> list;
	
	public void update(List<Data> nowList) {
        list = new ArrayList<>();
        if (nowList != null) {
            list.addAll(nowList);
        }
    }

	public void update(Data data) {
        List<Data> updateList = new ArrayList<>();
        updateList.addAll(list);
        updateList.add(data);
        list = new ArrayList<>();
        list.addAll(updateList);
    }
  • 第二步,主线程(Activity/Fragment)传递数据
	// 定义适配器对象
	private Adapter adapter;

	// 主线程的一些操作....比如:数据绑定、渲染、适配器初始化

	// 触发主线程的一些事件(点击、长按等)传递数据
	 private void onclick() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	// 获取到新数据list
            	List<Data> list = getNowListData();
            	
            	adapter.update(list);

				// 或者封装得到新实体Data
				Data data = getAddData();
				
				adapter.update(data);
            }
        });
    }

(2)观察者模式(推荐)

这里会要使用到发布-订阅的模式,Android中的ViewModel,看不懂的可以先从本栏目中的Fragment(碎片)中ViewModel的使用学习起

  • 效果视频
    在这里插入图片描述

实现过程

  • 第一步,定义一个XXViewModel
public class DataViewModel extends ViewModel {

    private MutableLiveData<List<Data>> mData;

    public LiveData<List<Data>> getListData() {
        mData = new MutableLiveData<>();
        List<Data> list = getData();
        // todo 需要排序算法和分页算法

        mData.setValue(list);
        return mData;
    }
	
	 /**
     * 获取数据
     */
	public List<Data> setData() {
		// 关于List<Data>的数据,数据库读取、网络读取...
	}
	
	 /**
     * 更新数据
     */
    public void setData() {
        Log.i("Data", "修改数据");
        
        List<Data> list = new ArrayList<>();   // 遍历当前好友的聊天数据
        list = setData();   // 再次获取到的数据(有所修改)
        mChatInfo.postValue(list);
    }
    
}
  • 第二步,触发事件
	private DataViewModel dataViewModel;    // 数据绑定对象,观察者
    private Adapter adapter;                // 适配器
    private RecyclerView data;              // UI控件

	// ....主函数

	// 布局初始化
	private void setChatInfoAdapter() {
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
        data.setLayoutManager(layoutManager);
        dataViewModel.getData().observe(this, new Observer<List<Data>>() {
                    @Override
                    public void onChanged(List<Data> list) {
                        adapter = new Adapter(list);
                        data.setAdapter(adapter);
                    }
                });
    }
	
	// 主线程触发事件
	private void onclick() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	 dataViewModel.setData();
            }
        });
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白可以看懂的「GraphQL」,GraphQL到底是啥样

GraphQL是一种用于API的查询语言&#xff0c;可以在服务端定义GraphQL Schema&#xff0c;客户端可以向服务端发送GraphQL请求&#xff0c;服务端执行GraphQL查询&#xff0c;并将结果作为JSON返回给客户端。 下面是一个使用golang实现GraphQL的示例&#xff0c;首先需要安装g…

Ajax请求与浏览器缓存

在现代Web应用程序中&#xff0c;前端代码充斥着大量的Ajax请求&#xff0c;如果对于Ajax请求可以使用浏览器缓存&#xff0c;那么可以显著地减少网络请求&#xff0c;提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求&#xff0c;示例代码如下&a…

RISC-V 学习篇之特权架构下的中断异常处理

RISC-V 学习篇之特权架构下的中断异常处理 控制流和Trap特权架构简单的嵌入式系统的机器模式机器模式下的异常处理mtvec&#xff08;Machine Trap-Vector Base-Address&#xff09;mepc&#xff08;Machine Exception Program Counter)mcause&#xff08;Machine Cause&#xf…

Erlang/OTP 26 正式发布

导读Erlang 是一种通用的并发函数式程序设计语言。Erlang 也可以指 Erlang/OTP 的通称&#xff0c;开源电信平台 (OTP) 是 Erlang 的常用执行环境及一系列标准组件。 Erlang/OTP 26.0 已正式发布。这是一个重要版本更新&#xff0c;包含许多新特性、改进和不兼容的变化。 主要…

C++11右值

C11右值 类型与值类别左值纯右值将亡值内置类型类类型 左值引用和右值引用内置类型右值引用&#xff1a;具有右值引用自身为左值。右值引用与函数重载函数返回值 自定义类型右值引用构造函数的隐式转换右值引用与函数重载类类型作为函数的返回值 右值引用与函数模板泛化版本&am…

Java005——idea编写和运行第一个Java程序HelloWorld

1、首相需要了解什么是IDE&#xff08;集成开发环境&#xff09;&#xff1f; 2、了解Java有哪些主流的开发工具&#xff1f; 一、创建一个文件夹用来存放Java项目 二、创建一个空项目 点击idea首页新建项目按钮 创建一个空项目 这样空项目就创建好了 三、在空项目中新建一…

leetcode 数据库题 584,585,586,595,596,601,602,607,608,610

leetcode 数据库题 第三弹 584. 寻找用户推荐人585. 2016年的投资586. 订单最多的客户595. 大的国家596. 超过5名学生的课601. 体育馆的人流量602. 好友申请 II &#xff1a;谁有最多的好友607. 销售员608. 树节点610. 判断三角形小结 584. 寻找用户推荐人 https://leetcode.cn…

<数据结构>NO7.二叉树(附Oj练习题)

&#x1f447;二叉树的完整代码在&#x1f447; syseptember的gitee仓库&#xff1a;二叉树https://gitee.com/syseptember/data-structure/tree/1513789167062c75dc172366199ce7a6b0577cc7/BinaryTree2/BinaryTree2 目录 树的概念及结构 0x01.树的概念 0x02.树的相关概念 …

快速定位接口问题,JMeter方法论,跨线程组接口关联测试!

目录 【前言】 【步骤】 1. 准备工作 2. 创建线程组 3. 创建HTTP请求 4. 添加正则表达式提取器 5. 添加HTTP请求关联控制器 6. 设置断言和验证器 7. 运行测试 【代码】 【结论】 【前言】 在进行接口测试时&#xff0c;接口之间的关联经常是我们需要重点测试的点之…

如何手写网络协议栈

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人。喜欢研究底层&#xff0c;聚焦做那些大家想学没地方学的课程&#xff1a;手写操作系统、手写虚拟机、手写编程语言…目前做了两门课&#xff1a;手写OS、手写JVM 今天想跟大家聊一个黑科技&#xff1a;手写网络协议栈…

Python的编码规范

目录 1、每个 import 语句只导入一个模块&#xff0c;尽量避免一次导入多个模块&#xff0c; 2、不要在行尾添加分号&#xff0c;也不要用分号将两条命令放在同一行&#xff0c; 3、建议每行不超过 80 个字符&#xff0c; 4、使用必要的空行可以增加代码的可读性 5、通常情…

让百万大学生崩溃的在线OJ,如何破局?

目录 一、在线OJ的的原理 二、在线OJ的使用规则 三、注意事项 1.关于作弊 2.如何防止作弊 3.输入输出格式 4.换行问题 四、经典在线OJ坑人题目以及博主被坑经历 五、提交不成功及解决方法 六、如何得心应手的拿下OJ系统 七、在线OJ的骗分技巧 在线OJ&#xff08;Onl…

OpenGL简介

1.简介 一般它被认为是一个API&#xff0c;包含了一系列可以操作图形、图像的函数。然而&#xff0c;OpenGL本身并不是一个API&#xff0c;它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行&#xff0c;以及它们的输出值。…

为何要用分布式锁Redis实现分布式锁

为何要用分布式锁 一、为什么要使用分布式锁 为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行&#xff0c;在传统单体应用单机部署的情况下&#xff0c;可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是&#xff0c;随着业务…

《论文阅读》连续前缀提示Prompt:table-to-text和摘要生成 ACL2021

《论文阅读》连续前缀提示Prompt:table-to-text和摘要生成 ACL2021 前言相关知识Table-to-Text Generation自编码语言模型自回归语言模型简介任务定义部分参数更新代码实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后…

高级算法工程师的工作职责(合集)

高级算法工程师的工作职责1 职责&#xff1a; 1、调研跟踪智能穿戴产品相关算法&#xff0c;为公司产品决策提供参考; 2、设计开发智能穿戴产品的计步、睡眠、心率、血氧饱和度、血压、心率变异性等相关参数的提取算法; 3、撰写算法开发文档&#xff0c;包括算法流程、测试方案…

小黑西安归来,政审完毕,眼睛手术做完一直在家躺着第5天的leetcode之旅:852. 山脉数组的峰顶索引

小黑代码 class Solution:def peakIndexInMountainArray(self, arr: List[int]) -> int:# 数组长度n len(arr)# 寻求山峰for i in range(n-1):if arr[i1] < arr[i]:return ireturn -1小黑二分模版 class Solution:def peakIndexInMountainArray(self, arr: List[int])…

Linux——内存和DMA

目录 本章目标&#xff1a; 一、内存组织 二、按页分配内存 三、slab分配器 四、不连续内存页分配 五、per-CPU变量 本章目标&#xff1a; 在前面的所有例子中&#xff0c;我们使用的都是全局变量或在栈上分配的内存。本章我们将先讨论如何动态分配内存和per-CPU变量。类…

实战-k8s中部署tomcat(四)

先下载资源&#xff1a;k8s中安装Tomcat 测试 k8s 集群中部署 tomcat 服务 #把 tomcat.tar.gz 上传到 k8s-node1&#xff0c;手动解压 [rootk8s-node1 ~]# ctr images import tomcat.tar.gz [rootk8s-master ~]# kubectl apply -f tomcat.yaml apiVersion: v1 #pod属于k8…

Augmentation Matters:一种简单而有效的半监督语义分割方法(CVPR2023)

文章目录 Augmentation Matters: A Simple-yet-Effective Approach to Semi-supervised Semantic Segmentation摘要本文方法Random Intensity-based AugmentationsAdaptive Label-aided CutMix 实验结果 Augmentation Matters: A Simple-yet-Effective Approach to Semi-superv…