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的数据进行更新,以反映数据源的变化。

相关推荐
Dann Hiroaki4 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
花花鱼4 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
KhalilRuan4 小时前
Unity-MMORPG内容笔记-其三
笔记
kfepiza5 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
alexhilton6 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
I'm写代码8 小时前
el-tree树形结构笔记
javascript·vue.js·笔记
AirDroid_cn9 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治9 小时前
手机电工仿真软件更新了
android
Andy杨10 小时前
20250707-4-Kubernetes 集群部署、配置和验证-K8s基本资源概念初_笔记
笔记·容器·kubernetes
xiangzhihong812 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios