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

文章目录

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

一、引言

  • 描述:如何在主线程(Activity/Fragment)UI中修改子线程(Adapter)的内容
  • 难度:初级
  • 知识点:
    1、Adapter适配器
    2、ViewModel观察者模式
  • 需求:
    1、点击List列表更新Adapter(例)
    【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)_第1张图片
    2、局外UI添加数据(例)
    【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)_第2张图片

二、解决方案

有些初学者看了有点懵,就需要先将同栏目下的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的使用学习起

  • 效果视频
    【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)_第3张图片

实现过程

  • 第一步,定义一个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的数据,数据库读取、网络读取...
	}
	
	 /**
     * 更新数据
     */
    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();
            }
        });
    }

你可能感兴趣的:(Android开发,android,java,ui)