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

文章介绍了如何在主线程(Activity/Fragment)中更新子线程(Adapter)的内容,提供了两种解决方案:1)直接更新数据并调用Adapter的notifyDataSetChanged()方法;2)使用观察者模式,通过ViewModel进行数据绑定和更新。推荐使用观察者模式,因为它能更好地实现组件间的解耦和数据同步。
摘要由CSDN通过智能技术生成

一、引言

  • 描述:如何在主线程(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();
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端new守夜人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值