当前位置:   article > 正文

Android开发——ListView

Android开发——ListView

activity_main.xml

  1. <?xml version="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. <?xml version="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<bean> data;
  12. private final Context context;
  13. public MyAdapter(ArrayList<bean> 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<bean> 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<bean> 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组件,负责将数据呈现到界面上,并提供了一系列的方法和机制,保证了界面的流畅性和用户体验

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/477623
推荐阅读
相关标签
  

闽ICP备14008679号