activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/main"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</ListView>
</LinearLayout>
item.xml
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"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="30sp"/>
</LinearLayout>
item.xml
是用于定义列表项布局的 XML 文件。在 Android 中,通常使用 ListView
或 RecyclerView
来显示列表数据,而列表中的每一项就是一个列表项。item.xml
文件用于定义列表中每一项的布局结构,包括显示数据的控件(如 TextView
、ImageView
等)以及它们的样式和排列方式。
在使用 ListView
或 RecyclerView
时,你需要创建一个适配器(Adapter),并在适配器中指定列表项的布局文件(即 item.xml
),以便在列表中显示每一项的内容。适配器根据数据源中的数据,动态地加载布局文件,并将数据填充到布局中,然后显示在列表中。
因此,item.xml
文件的作用是定义列表中每一项的布局结构,它决定了列表中每个数据项的显示样式和内容:
MyAdapter.java
java
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyAdapter extends BaseAdapter {
private final ArrayList<bean> data;
private final Context context;
public MyAdapter(ArrayList<bean> data,Context context)
{
this.data = data;
this.context = context;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("SuspiciousIndentation")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(data.get(position).getName());
return convertView;
}
static class ViewHolder {
TextView textView;
}
}
这段代码是一个自定义的适配器(Adapter),用于将数据绑定到列表视图(ListView)中。逐步解释:
MyAdapter
类继承自BaseAdapter
,它是 Android 中适配器的基类之一,用于在列表视图中显示数据。- 构造方法
MyAdapter(ArrayList<bean> data, Context context)
接收一个ArrayList
类型的数据源和一个上下文对象。数据源是用来填充列表项的数据,而上下文对象用于加载布局文件。 getCount()
方法返回数据源中的数据项数量,即列表中的项数。getItem()
方法根据位置返回数据项。getItemId()
方法返回数据项的唯一标识符,通常是其在数据源中的位置。getView()
方法用于获取每个列表项的视图。它接收三个参数:位置(position)、可重用的视图(convertView)和列表的父视图(parent)。- 在方法中,首先通过
LayoutInflater
加载列表项的布局文件R.layout.item
,如果convertView
为 null,则新建一个视图,并将其缓存在ViewHolder
对象中,以提高性能。 - 然后,从缓存的
ViewHolder
对象中获取视图控件,并将数据绑定到控件上,设置相应的文本。 - 最后,返回填充好数据的视图。
- 在方法中,首先通过
ViewHolder
类是一个内部静态类,用于缓存列表项中的视图控件,以便在滚动列表时快速访问,提高性能。
MainActivity.java
java
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private final ArrayList<bean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
for(int i=0;i<100;i++)
{
bean bn = new bean();
bn.setName("WJH"+i);
data.add(bn);
}
ListView listview = findViewById(R.id.lv);
listview.setAdapter(new MyAdapter(data,this));
}
}
MainActivity
类继承自AppCompatActivity
,它是 Android 中的一个活动(Activity)类,用于展示用户界面和处理用户交互。- 在
onCreate()
方法中,首先调用了父类的onCreate()
方法以执行基本的初始化操作。 - 接着调用
EdgeToEdge.enable(this)
方法启用了边缘到边缘布局,该方法来自于第三方库,用于在 Android 应用中实现全屏显示。 - 使用
setContentView(R.layout.activity_main)
方法设置了当前活动的布局为activity_main.xml
。 - 使用
ViewCompat.setOnApplyWindowInsetsListener()
方法监听窗口布局变化,并在发生变化时调整主布局的内边距,以适应系统状态栏和导航栏。 - 创建了一个包含 100 个
bean
对象(自定义对象)的ArrayList
,用于作为列表视图的数据源。 - 使用
for
循环生成 100 个bean
对象,并设置它们的名称。 - 获取列表视图对象
ListView
并通过findViewById()
方法找到对应的视图。 - 使用自定义的适配器
MyAdapter
将数据源绑定到列表视图上,从而在界面上显示出来。
综上所述,这段代码实现了一个简单的活动,在界面中显示了一个包含 100 个列表项的列表视图,并且使用了边缘到边缘布局来实现全屏显示效果。
PS:
适配器类的作用是:
-
数据适配: Adapter类用于将数据源与UI控件进行绑定,将数据适配到特定的UI组件中,比如ListView、RecyclerView等。它负责从数据源中获取数据,并将数据呈现到相应的UI组件上。
-
视图渲染: Adapter负责渲染数据项的视图,即将数据显示在UI组件上。在Adapter中,通过实现getView()方法,可以定义每个数据项的呈现方式,包括布局、样式、内容等。
-
视图复用: 为了提高性能和节省资源,Android中的ListView、RecyclerView等UI组件在滚动时会复用已经创建的视图对象。Adapter类负责管理视图的创建和复用,确保在滚动过程中能够高效地显示数据。
-
ViewHolder模式: 为了进一步提高性能,Adapter类通常会采用ViewHolder模式对视图进行缓存。ViewHolder是一个简单的Java类,用于保存视图对象的引用,避免在getView()方法中重复查找视图,从而提高渲染效率。
-
数据更新: 当数据源发生变化时,Adapter负责通知UI组件进行相应的更新。它提供了一系列的方法,比如notifyDataSetChanged()、notifyItemInserted()等,用于通知UI组件刷新数据。
总的来说,Adapter类在Android开发中起到了桥梁的作用,连接了数据源和UI组件,负责将数据呈现到界面上,并提供了一系列的方法和机制,保证了界面的流畅性和用户体验