• Android开发——ListView


    activity_main.xml

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_height="match_parent"
    4. android:layout_width="match_parent"
    5. android:id="@+id/main"
    6. android:orientation="vertical">
    7. <ListView
    8. android:id="@+id/lv"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"
    11. >
    12. ListView>
    13. LinearLayout>

    item.xml

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical">
    6. <TextView
    7. android:id="@+id/tv"
    8. android:layout_width="match_parent"
    9. android:layout_height="match_parent"
    10. android:textSize="30sp"/>
    11. LinearLayout>

    item.xml 是用于定义列表项布局的 XML 文件。在 Android 中,通常使用 ListViewRecyclerView 来显示列表数据,而列表中的每一项就是一个列表项。item.xml 文件用于定义列表中每一项的布局结构,包括显示数据的控件(如 TextViewImageView 等)以及它们的样式和排列方式。

    在使用 ListViewRecyclerView 时,你需要创建一个适配器(Adapter),并在适配器中指定列表项的布局文件(即 item.xml),以便在列表中显示每一项的内容。适配器根据数据源中的数据,动态地加载布局文件,并将数据填充到布局中,然后显示在列表中。

    因此,item.xml 文件的作用是定义列表中每一项的布局结构,它决定了列表中每个数据项的显示样式和内容:

    MyAdapter.java

    1. package com.example.myapplication;
    2. import android.annotation.SuppressLint;
    3. import android.content.Context;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.ViewGroup;
    7. import android.widget.BaseAdapter;
    8. import android.widget.TextView;
    9. import java.util.ArrayList;
    10. public class MyAdapter extends BaseAdapter {
    11. private final ArrayList data;
    12. private final Context context;
    13. public MyAdapter(ArrayList data,Context context)
    14. {
    15. this.data = data;
    16. this.context = context;
    17. }
    18. @Override
    19. public int getCount() {
    20. return data.size();
    21. }
    22. @Override
    23. public Object getItem(int position) {
    24. return null;
    25. }
    26. @Override
    27. public long getItemId(int position) {
    28. return position;
    29. }
    30. @SuppressLint("SuspiciousIndentation")
    31. @Override
    32. public View getView(int position, View convertView, ViewGroup parent) {
    33. ViewHolder viewHolder;
    34. if (convertView == null) {
    35. convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
    36. viewHolder = new ViewHolder();
    37. viewHolder.textView = convertView.findViewById(R.id.tv);
    38. convertView.setTag(viewHolder);
    39. } else {
    40. viewHolder = (ViewHolder) convertView.getTag();
    41. }
    42. viewHolder.textView.setText(data.get(position).getName());
    43. return convertView;
    44. }
    45. static class ViewHolder {
    46. TextView textView;
    47. }
    48. }

    这段代码是一个自定义的适配器(Adapter),用于将数据绑定到列表视图(ListView)中。逐步解释:

    1. MyAdapter 类继承自 BaseAdapter,它是 Android 中适配器的基类之一,用于在列表视图中显示数据。
    2. 构造方法 MyAdapter(ArrayList data, Context context) 接收一个 ArrayList 类型的数据源和一个上下文对象。数据源是用来填充列表项的数据,而上下文对象用于加载布局文件。
    3. getCount() 方法返回数据源中的数据项数量,即列表中的项数。
    4. getItem() 方法根据位置返回数据项。
    5. getItemId() 方法返回数据项的唯一标识符,通常是其在数据源中的位置。
    6. getView() 方法用于获取每个列表项的视图。它接收三个参数:位置(position)、可重用的视图(convertView)和列表的父视图(parent)。
      • 在方法中,首先通过 LayoutInflater 加载列表项的布局文件 R.layout.item,如果 convertView 为 null,则新建一个视图,并将其缓存在 ViewHolder 对象中,以提高性能。
      • 然后,从缓存的 ViewHolder 对象中获取视图控件,并将数据绑定到控件上,设置相应的文本。
      • 最后,返回填充好数据的视图。
    7. ViewHolder 类是一个内部静态类,用于缓存列表项中的视图控件,以便在滚动列表时快速访问,提高性能。

    MainActivity.java

    1. package com.example.myapplication;
    2. import android.content.Intent;
    3. import android.os.Bundle;
    4. import android.view.View;
    5. import android.widget.AdapterView;
    6. import android.widget.ListView;
    7. import androidx.activity.EdgeToEdge;
    8. import androidx.appcompat.app.AppCompatActivity;
    9. import androidx.core.graphics.Insets;
    10. import androidx.core.view.ViewCompat;
    11. import androidx.core.view.WindowInsetsCompat;
    12. import java.util.ArrayList;
    13. public class MainActivity extends AppCompatActivity {
    14. private final ArrayList data = new ArrayList<>();
    15. @Override
    16. protected void onCreate(Bundle savedInstanceState) {
    17. super.onCreate(savedInstanceState);
    18. EdgeToEdge.enable(this);
    19. setContentView(R.layout.activity_main);
    20. ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
    21. Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
    22. v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
    23. return insets;
    24. });
    25. for(int i=0;i<100;i++)
    26. {
    27. bean bn = new bean();
    28. bn.setName("WJH"+i);
    29. data.add(bn);
    30. }
    31. ListView listview = findViewById(R.id.lv);
    32. listview.setAdapter(new MyAdapter(data,this));
    33. }
    34. }
    1. MainActivity 类继承自 AppCompatActivity,它是 Android 中的一个活动(Activity)类,用于展示用户界面和处理用户交互。
    2. onCreate() 方法中,首先调用了父类的 onCreate() 方法以执行基本的初始化操作。
    3. 接着调用 EdgeToEdge.enable(this) 方法启用了边缘到边缘布局,该方法来自于第三方库,用于在 Android 应用中实现全屏显示。
    4. 使用 setContentView(R.layout.activity_main) 方法设置了当前活动的布局为 activity_main.xml
    5. 使用 ViewCompat.setOnApplyWindowInsetsListener() 方法监听窗口布局变化,并在发生变化时调整主布局的内边距,以适应系统状态栏和导航栏。
    6. 创建了一个包含 100 个 bean 对象(自定义对象)的 ArrayList,用于作为列表视图的数据源。
    7. 使用 for 循环生成 100 个 bean 对象,并设置它们的名称。
    8. 获取列表视图对象 ListView 并通过 findViewById() 方法找到对应的视图。
    9. 使用自定义的适配器 MyAdapter 将数据源绑定到列表视图上,从而在界面上显示出来。

    综上所述,这段代码实现了一个简单的活动,在界面中显示了一个包含 100 个列表项的列表视图,并且使用了边缘到边缘布局来实现全屏显示效果。

    PS:

    适配器类的作用是:

    1. 数据适配: Adapter类用于将数据源与UI控件进行绑定,将数据适配到特定的UI组件中,比如ListView、RecyclerView等。它负责从数据源中获取数据,并将数据呈现到相应的UI组件上。

    2. 视图渲染: Adapter负责渲染数据项的视图,即将数据显示在UI组件上。在Adapter中,通过实现getView()方法,可以定义每个数据项的呈现方式,包括布局、样式、内容等。

    3. 视图复用: 为了提高性能和节省资源,Android中的ListView、RecyclerView等UI组件在滚动时会复用已经创建的视图对象。Adapter类负责管理视图的创建和复用,确保在滚动过程中能够高效地显示数据。

    4. ViewHolder模式: 为了进一步提高性能,Adapter类通常会采用ViewHolder模式对视图进行缓存。ViewHolder是一个简单的Java类,用于保存视图对象的引用,避免在getView()方法中重复查找视图,从而提高渲染效率。

    5. 数据更新: 当数据源发生变化时,Adapter负责通知UI组件进行相应的更新。它提供了一系列的方法,比如notifyDataSetChanged()、notifyItemInserted()等,用于通知UI组件刷新数据。

    总的来说,Adapter类在Android开发中起到了桥梁的作用,连接了数据源和UI组件,负责将数据呈现到界面上,并提供了一系列的方法和机制,保证了界面的流畅性和用户体验

  • 相关阅读:
    Go微服务框架go-kratos实战03:使用 gorm 实现增删改查操作
    react hook
    学习笔记- PHP回调函数
    R语言使用data.table包的fread函数读取(加载)csv数据为data.table格式、使用select参数指定需要读取的字段列表(变量列表)
    Django 前后端分离(REST Framework)
    Vuex状态管器:Mutations
    java ssm创意设计分享系统
    【Redis技术探索】「高可用架构模式」哨兵(sentinel)模式实现主从故障互切换模式详解
    Dubbo-聊聊通信模块设计
    RFID产线自动化升级改造管理方案
  • 原文地址:https://blog.csdn.net/qq_64863535/article/details/137795382