AdapterView的数据更新

AdapterView的数据更新 在 Android 中,AdapterView(如ListViewGridViewSpinner)的数据更新涉及到数据源的改变以及通知Adapter数据已变化,从而更新视图。以下以ListView为例,介绍AdapterView数据更新的常见方法:

1. 基本步骤

  1. 修改数据源 :首先需要修改用于填充AdapterView的数据源,例如一个ArrayList或其他集合。
  2. 通知 Adapter :数据源改变后,调用AdapternotifyDataSetChanged()方法通知Adapter数据发生了变化,Adapter会重新计算并更新AdapterView的显示。

2. 示例代码

假设我们有一个ListView,使用ArrayAdapter来显示字符串列表。

布局文件(activity_main.xml)

xml

ini 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/add_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加数据" />
</LinearLayout>

主活动代码(MainActivity.java)

java

java 复制代码
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayAdapter<String> adapter;
    private List<String> dataList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.list_view);
        Button addButton = findViewById(R.id.add_button);

        // 初始化数据源
        dataList.add("第一项");
        dataList.add("第二项");

        // 创建并设置Adapter
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
        listView.setAdapter(adapter);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 修改数据源
                dataList.add("新的一项");
                // 通知Adapter数据已变化
                adapter.notifyDataSetChanged();
            }
        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String item = dataList.get(position);
                Toast.makeText(MainActivity.this, "点击了: " + item, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

在上述代码中,当点击 "添加数据" 按钮时,会向dataList中添加一个新的字符串,然后调用adapter.notifyDataSetChanged()方法通知ArrayAdapter数据已发生变化,ListView会自动更新显示。

3. 其他情况

  • 删除数据 :从数据源中移除相应的数据项,然后同样调用notifyDataSetChanged()方法。例如:

java

ini 复制代码
dataList.remove(position);
adapter.notifyDataSetChanged();
  • 插入数据到指定位置 :在数据源的指定位置插入数据,再调用notifyDataSetChanged()。例如:

java

ini 复制代码
dataList.add(index, newItem);
adapter.notifyDataSetChanged();

如果使用BaseAdapter或自定义的RecyclerView.Adapter,数据更新的原理类似,都是先修改数据源,然后调用相应AdapternotifyDataSetChanged()方法。不过对于RecyclerView.Adapter,还可以使用更细粒度的更新方法,如notifyItemInserted(int position)notifyItemRemoved(int position)等,这些方法可以实现局部刷新,提高性能。例如:

java

scss 复制代码
// RecyclerView.Adapter 更新单个项
dataList.add(index, newItem);
adapter.notifyItemInserted(index);

通过以上方式,可以有效地对AdapterView的数据进行更新,以反映数据源的变化。

相关推荐
轻闲一号机11 分钟前
【机器学习】机器学习笔记
人工智能·笔记·机器学习
天下琴川1 小时前
Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
人工智能·笔记
AD钙奶-lalala1 小时前
某车企面试备忘
android
我爱拉臭臭2 小时前
kotlin音乐app之自定义点击缩放组件Shrink Layout
android·java·kotlin
workworkwork勤劳又勇敢3 小时前
Adversarial Attack对抗攻击--李宏毅机器学习笔记
人工智能·笔记·深度学习·机器学习
匹马夕阳3 小时前
(二十五)安卓开发一个完整的登录页面-支持密码登录和手机验证码登录
android·智能手机
吃饭了呀呀呀3 小时前
🐳 深度解析:Android 下拉选择控件优化方案——NiceSpinner 实践指南
android·java
寻丶幽风4 小时前
论文阅读笔记——Generating Long Sequences with Sparse Transformers
论文阅读·笔记·语言模型·transformer·稀疏自注意力
Angindem4 小时前
websoket 学习笔记
笔记·学习
吃饭了呀呀呀4 小时前
🐳 《Android》 安卓开发教程 - 三级地区联动
android·java·后端