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 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker12 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952713 小时前
Andorid Google 登录接入文档
android
黄林晴14 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android