IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android基础——ListView -> 正文阅读

[移动开发]Android基础——ListView

ListView是什么?

ListView以列表的形式展现数据,用户可通过对屏幕的上下滑动加载数据。

纯列表ListView

在activity_main.xml中加入ListView:

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

修改MainActivity,用系统自带的ArrayAdapter,参数分别为Context、适配布局id和要适配的数据,这里适配布局采用内置布局android.R.layout.simple_list_item_1

public class MainActivity extends AppCompatActivity {

    private String[] data = {"A", "B", "C", "D", "E", "F", "G", "H"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}

效果图:
在这里插入图片描述

定制ListView

准备数据,创建名为Data的bean类:

public class Data {
    private String name;
    private int imageId;

    public Data(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}

准备ListView的适配布局,创建list_item.xml:

<?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">
    <ImageView
        android:id="@+id/list_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/list_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

创建数据适配器,重写构造器暂存数据、重写getView()方法加载布局并获取控件设置数据:

public class DataAdapter extends ArrayAdapter<Data> {

    private int resourceId;

    public DataAdapter(@NonNull Context context, int resource, @NonNull List<Data> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Data data = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
        ImageView dataIv = view.findViewById(R.id.list_iv);
        TextView dataTv = view.findViewById(R.id.list_tv);
        dataIv.setImageResource(data.getImageId());
        dataTv.setText(data.getName());
        return view;
    }
}

找到ListView并为其添加适配器:

public class MainActivity extends AppCompatActivity {
    
    private List<Data> dataList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        DataAdapter adapter = new DataAdapter(MainActivity.this, R.layout.list_item, dataList);
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);

    }

    private void initData() {
        for (int i = 0; i < 5; i++) {
            Data data = new Data("data" + i, R.mipmap.ic_launcher);
            dataList.add(data);
        }
    }
}

提升ListView效率

在上面DataAdapter的getView()方法中,每次都会将布局重新加载,当快速滑动时,可能会出现问题。与此同时,每次加载都会调用findViewById获取控件实例,大大影响ListView效率。

解决办法:

  1. 通过getView()中的convertView参数,可以缓存加载好的布局,避免重复加载。
  2. 创建内部类ViewHolder暂存控件实例

修改后的Adapter如下:

public class DataAdapter extends ArrayAdapter<Data> {

    private int resourceId;

    public DataAdapter(@NonNull Context context, int resource, @NonNull List<Data> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Data data = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.dataIv = view.findViewById(R.id.list_iv);
            viewHolder.dataTv = view.findViewById(R.id.list_tv);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.dataIv.setImageResource(data.getImageId());
        viewHolder.dataTv.setText(data.getName());
        return view;
    }

    private class ViewHolder {
        ImageView dataIv;
        TextView dataTv;
    }
}

ListView点击事件

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, dataList.get(position).getName(), Toast.LENGTH_SHORT).show();
            }
        });
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:36:36  更:2021-07-24 11:37:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 22:47:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码