Android开发--Lesson02--常见的控件
一.简单空间
TextView
TextView用来显示文本信息,可以在XML文件中添加并且添加其相对的样式:
它的样式主要有以下内容:
<TextView android:id="@+id/textViewExample" <!-- 设置TextView的唯一标识符,用于在代码中引用 --> android:layout_width="wrap_content" <!-- 设置宽度为内容宽度,即根据文本长度自动调整 --> android:layout_height="wrap_content" <!-- 设置高度为内容高度,即根据文本高度自动调整 --> android:text="这是一个示例文本" <!-- 设置TextView显示的文本内容 --> android:textSize="18sp" <!-- 设置文本字体大小为18sp(推荐使用sp单位以支持用户字体偏好设置) --> android:textColor="#0000FF" <!-- 设置文本颜色为蓝色(十六进制颜色值) --> android:fontFamily="sans-serif" <!-- 设置字体族为无衬线字体(如Arial或Helvetica) --> android:textStyle="bold" <!-- 设置文本样式为粗体 --> android:gravity="center" <!-- 设置文本在其容器内的对齐方式为居中 --> android:padding="10dp" <!-- 设置TextView内部四周的填充距离为10dp --> android:background="#FFFF00" <!-- 设置TextView的背景颜色为黄色 --> android:drawableLeft="@drawable/icon_example" <!-- 在文本左边添加一个图标资源 --> android:drawablePadding="5dp" <!-- 设置文本与左边图标的间距为5dp --> android:ellipsize="end" <!-- 当文本超出可用空间时,在末尾添加省略号 --> android:maxLines="2" <!-- 设置文本的最大行数为2行 --> android:clickable="true" <!-- 使TextView可点击 --> android:focusable="true" <!-- 使TextView可以获得焦点 --> />
示例图:
Button
Button
控件是 Android 应用开发中最常用的 UI 组件之一,主要用于触发用户交互操作。
基本特性
- 触发事件:
Button
是用户与应用进行交互的主要方式之一,通常用于启动操作或导航到其他界面。 - 样式可定制:可以通过 XML 属性或代码自定义按钮的外观,包括文本、颜色、背景等。
事件处理举例:
<Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击我" android:onClick="onButtonClick" />
Java代码:
Button myButton = findViewById(R.id.my_button);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 处理点击事件
}
});
第二种方式:不在XML文件中放置onClick事件,而是直接在Java代码中直接实现类的方式绑定事件
//使用Java代码绑定事件
Button btn = findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn.setText("被点击了");
}
});
第三种方式实现View.OnClickListener接口,同时重写其方法
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@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;
});
Button bt = findViewById(R.id.bt);
bt.setOnClickListener(this);//自己就是监听器的实现类,故而将自己丢入监听器中
}
@Override
public void onClick(View v) {
TextView tv = v.findViewById(R.id.tv);
tv.setText("按钮被点击");
}
}
EditText
EditText 是 Android 中用于接收用户输入文本的 UI 组件。它继承自 TextView,因此具备 TextView 的所有特性,并且增加了一些专门用于处理用户输入的功能。
EditText
是 Android 应用开发中非常重要的组件之一,用于接收用户的文本输入。通过合理配置其属性和事件监听器,可以实现丰富的用户交互体验。
基础属性
- android:hint:设置提示文本,在用户未输入任何内容时显示。示例:android:hint="请输入内容"
- android:text:设置初始文本内容。示例:android:text="默认文本"
- android:textSize 和 android:textColor:设置文本大小和颜色。示例:android:textSize="16sp" 和 android:textColor="#0000FF"
- android:inputType:指定输入类型,以控制键盘布局和输入限制。示例:android:inputType="textPassword"(密码输入框)、android:inputType="number"(数字输入框)。
简单示例:
XML布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" android:inputType="textPersonName" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="click me"/> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{
@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;
});
Button bt = findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = findViewById(R.id.et);//获取EditText
TextView tv = findViewById(R.id.tv);//获取ViewText
tv.setText(et.getText().toString());//点击按钮后写入内容到ViewText中
}
});
}
}
ImageView
在Android开发中,ImageView 是一个非常常用的UI组件,主要用于展示图像内容。它能够加载并显示各种来源的图片,如资源文件、网络图片或内存中的位图等。
作用
显示图片:最基本的功能是用于显示图片,支持多种格式(如PNG、JPG等)。
调整图片大小和比例:通过属性设置,可以控制图片的缩放模式、裁剪方式等,以适应不同的布局需求。
标签格式如下:
<!-- 在布局文件中 --> <ImageView android:id="@+id/my_image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/my_image" android:scaleType="centerCrop"/>
同时可以通过Java代码动态加载图片:
// 在Activity中
ImageView imageView = findViewById(R.id.my_image_view);
// 如果需要动态设置图片资源,可以使用setImageResource方法
imageView.setImageResource(R.drawable.another_image);
RadioButton
RadioButton
是用于实现单选功能的UI组件。它通常与 RadioGroup
一起使用,以确保在同一组中的多个 RadioButton
中只能选择一个。
作用
单选功能:RadioButton 最主要的作用是让用户从一组选项中选择一项。通过与 RadioGroup 结合使用,可以限制用户仅能选择一个选项。
状态显示:可以直观地显示出哪个选项被选中(通常是通过按钮内的点来表示)。
- 必须结合
RadioGroup
使用:为了实现单选功能,RadioButton
需要放在RadioGroup
中。这保证了同一时间只能有一个RadioButton
被选中。 - 事件监听:可以通过设置
OnCheckedChangeListener
来监听选项的变化,从而执行相应的操作。 - 自定义样式:支持对
RadioButton
进行样式上的定制,比如改变选中和未选中时的图标等。
示例案例:
XML文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <RadioGroup android:id="@+id/rgp" android:layout_width="match_parent" android:layout_height="wrap_content" > <RadioButton android:id="@+id/rb1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="男"/> <RadioButton android:id="@+id/rb2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女"/> <RadioButton android:id="@+id/rb3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="沃尔玛购物袋"/> </RadioGroup> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="你选择的是:"/> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{
@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;
});
//找到单选组
RadioGroup rgp = findViewById(R.id.rgp);
//文本框
TextView tv =findViewById(R.id.tv);
//利用setOnCheckedChangeListener,这是专门的单选监听器
rgp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId==R.id.rb1){
tv.setText("您选择的是:男");
}
if (checkedId==R.id.rb2){
tv.setText("您选择的是:女");
}
if (checkedId==R.id.rb3){
tv.setText("您选择的是:沃尔玛购物袋");
}
}
});
}
}
样式:
CheckBox
CheckBox 是一种允许用户从一组选项中选择多个选项的UI组件。与 RadioButton 不同,CheckBox 允许用户独立地选中或取消选中每一个选项,而不需要与其他选项互斥。
作用
多选功能:CheckBox 主要用于提供多选功能,让用户能够自由选择一个或多个选项。
状态显示:可以直观地显示出哪些选项被选中(通常通过打勾表示)。
特点
- 独立性:每个 CheckBox 都是独立工作的,用户可以选择任意数量的复选框。
- 事件监听:可以通过设置 OnCheckedChangeListener 来监听用户的选中或取消选中操作,从而执行相应的逻辑处理。
- 自定义样式:支持对 CheckBox 进行样式上的定制,例如改变选中和未选中时的图标等
示例案例:
XML展示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="您选择的是:"/> <CheckBox android:id="@+id/cb1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="basketball"/> <CheckBox android:id="@+id/cb2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="pingpong"/> <CheckBox android:id="@+id/cb3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="music"/> <CheckBox android:id="@+id/cb4" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="game"/> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{
//拿取到TextView
private TextView tv;
private String msg="你选择的是:";
@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;
});
//获得checkBox按钮
CheckBox cb1 = findViewById(R.id.cb1);
CheckBox cb2 = findViewById(R.id.cb2);
CheckBox cb3 = findViewById(R.id.cb3);
CheckBox cb4 = findViewById(R.id.cb4);
tv = findViewById(R.id.tv);
//添加监听事件
cb1.setOnCheckedChangeListener(this);
cb2.setOnCheckedChangeListener(this);
cb3.setOnCheckedChangeListener(this);
cb4.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
//先判断字符是否在按钮信息中,如果没在需要添加,在就不需要管
if (!msg.contains(buttonView.getText().toString())){
msg+=buttonView.getText().toString()+" ";
tv.setText(msg);
}
}else {
//反情况,需要替换掉
if (msg.contains(buttonView.getText().toString())){
msg=msg.replace(buttonView.getText().toString()," ");
tv.setText(msg);
}
}
}
}
结果展示:
Toast
Toast 是一种用于向用户显示简短消息的机制。它通常用于提示用户某些操作的结果或状态变化,而不会打断用户的当前操作流程。Toast 消息会短暂地显示在屏幕的底部(默认位置),然后自动消失
作用
- 临时通知:
Toast
主要用于显示临时性的通知信息,例如确认操作成功、警告信息等。 - 不打断用户体验:与对话框不同,
Toast
不会抢夺用户的焦点,也不会暂停用户正在进行的操作。
特点
- 短暂显示:
Toast
显示一段时间后会自动消失,默认持续时间可以设置为短时间(Toast.LENGTH_SHORT
)或长时间(Toast.LENGTH_LONG
)。 - 无交互性:用户无法与
Toast
进行交互,如点击关闭等。 - 自定义样式:虽然
Toast
的基本样式较为固定,但可以通过一些方法进行有限的自定义,比如修改背景颜色或文字颜色。
示例案例:
XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me,please now!" /> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{
@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;
});
//拿到按钮
Button btn = findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"我被点击了",Toast.LENGTH_LONG).show();
}
});
}
}
截图:
二.AlertDialog对话框
对话框大多都是由Java代码直接构成,而不需要页面的提前占位,故而不需要XML文件的编写
AlertDialog
是一种用于显示对话框的UI组件。它能够弹出一个模态窗口(即需要用户交互才能继续操作),用于提示信息、获取用户输入或确认用户的操作等。AlertDialog
提供了丰富的定制选项,可以用来创建多种类型的对话框
- 提供反馈:向用户提供简短的信息反馈,例如操作成功或失败的消息。
- 确认操作:请求用户确认某个重要操作,例如删除数据前的确认提示。
- 获取输入:从用户那里收集必要的信息,比如文本输入、选择选项等。
- 展示选项:提供一系列选项供用户选择,通常以列表形式呈现。
- 模态对话框:当
AlertDialog
显示时,用户必须与之交互才能返回到应用的其他部分。 - 可定制性强:可以轻松地添加标题、消息、按钮(正面、负面和中性按钮)、列表项或自定义视图。
- 事件处理:可以通过设置监听器来响应用户的交互,如点击按钮或选择列表项。
普通对话框
示例案例:
Java代码:
public class MainActivity extends AppCompatActivity{
@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;
});
//普通对话框
AlertDialog alertDialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("普通对话框")//标题
.setIcon(R.drawable.ic_launcher_background)//图像
.setMessage("是否退出应用")//主体内容
.setPositiveButton("确定", new DialogInterface.OnClickListener() {//确定事件
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
MainActivity.this.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//取消事件
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog = builder.create();
alertDialog.show();
}
}
结果:
单选对话框
在Android开发中,单选对话框(Radio Button Dialog)是一种允许用户从一组选项中选择一个选项的界面元素。它通常用于需要用户做出唯一选择的情形
作用
提供一种直观的方式来让用户进行单一选择。
确保用户只能选择提供的选项之一,这有助于数据的一致性和准确性。
示例案例
Java代码:
public class MainActivity extends AppCompatActivity{ private int wh = 0; @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; }); TextView tv = findViewById(R.id.tv); Button bt = findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建一个AlertDialog对象 AlertDialog alertDialog; // 创建一个AlertDialog.Builder对象,并设置标题和图标 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setTitle("设置字体大小") .setIcon(R.drawable.ic_launcher_foreground) // 设置单选列表项,并设置点击事件 .setSingleChoiceItems(new String[]{"small", "mid", "big", "bigger"}, wh, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 将选中的项赋值给wh wh = which; } }) // 设置确定按钮,并设置点击事件 .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 定义字体大小数组 int[] fontSize = {10, 20, 30, 40, 50}; // 设置字体大小 tv.setTextSize(fontSize[wh]); // 关闭对话框 dialog.dismiss(); } }) // 设置取消按钮,并设置点击事件 .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 关闭对话框 dialog.dismiss(); } }); // 创建AlertDialog对象 alertDialog =builder.create(); // 显示对话框 alertDialog.show(); } }); } }
结果视图:
多选对话框
选对话框(Checkbox Dialog)允许用户从一组选项中选择多个选项。与单选对话框不同,它不限制用户的选项数量,适用于需要用户做出多项选择的场景作用
- 提供一种方式让用户能够选择一个或多个选项。
- 特别适合于那些需要收集用户偏好或配置信息的应用场景。
示例案例
Java代码:
public class MainActivity extends AppCompatActivity{ @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; }); TextView tv = findViewById(R.id.tv); Button bt = findViewById(R.id.bt); boolean[] ba = new boolean[]{false, false, true, true}; String[] st = new String[]{"basketball", "pingpang", "music", "water"}; bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建一个AlertDialog对象 AlertDialog alertDialog; // 创建一个AlertDialog.Builder对象 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // 设置AlertDialog的标题 builder.setTitle("请选择兴趣爱好") // 设置AlertDialog的图标 .setIcon(R.drawable.ic_launcher_background) // 设置AlertDialog的多选列表项 .setMultiChoiceItems(st, ba, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // 将选中的项保存到ba数组中 ba[which]=isChecked; } }) // 设置AlertDialog的确定按钮 .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 创建一个StringBuffer对象,用于保存选中的项 StringBuffer buffer = new StringBuffer(); buffer.append("您选择的是:"); // 遍历ba数组,将选中的项添加到buffer中 for (int i = 0; i < ba.length; i++) { if (ba[i]){ buffer.append(" "+st[i]); } } // 将选中的项显示在TextView中 tv.setText(buffer.toString()); // 关闭AlertDialog dialog.dismiss(); } }) // 设置AlertDialog的取消按钮 .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 弹出提示框,提示用户放弃了修改 Toast.makeText(MainActivity.this,"您放弃了修改",Toast.LENGTH_LONG).show(); // 关闭AlertDialog dialog.dismiss(); } }); // 创建AlertDialog对象 alertDialog = builder.create(); // 显示AlertDialog alertDialog.show(); } }); } }
结果:
三.ListView
ListView 是一种非常常用的UI组件,用于在垂直滚动列表中显示项目集合。每个项目可以通过自定义布局进行展示,这使得 ListView 成为了展示大量数据的理想选择。
作用
展示数据:能够以列表形式展示大量的数据项,如联系人列表、消息列表等。
优化性能:通过使用视图回收机制(View Recycling),有效地管理内存和提升性能,尤其是在处理大数据集时。
用户交互:支持点击、长按等多种交互事件,允许开发者为用户提供丰富的操作选项。
使用ListView控件需要有一个分解的思想:原来的控件都是卸载一个XML文件,当然就为一个页面显示,但是现在使用ListView就不一样了,它需要动态的加载新的数据到显示屏上,那么就需要控制新加载上来的数据样式,最好的做法就是单独写一个XML文件样式用于控制这个动态加载的数据的样式,主XML文件负责引入这个样式就好了,就好比另写一个模板一样
示例:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <ListView android:id="@+id/lv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="none"/> </LinearLayout>
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" android:orientation="horizontal"> <ImageView android:id="@+id/iv" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/ic_launcher_background"/> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="vertical"> <TextView android:id="@+id/tv1" android:layout_width="match_parent" android:layout_height="30dp" android:text="名称"/> <TextView android:id="@+id/tv2" android:layout_width="match_parent" android:layout_height="30dp" android:text="解释" /> </LinearLayout> </LinearLayout>
Java代码
在ListView控件中,需要使用到一个叫适配器的东西,顾名思义,它就是用来将视图层和后端Java代码进行适配的
BaseAdapter 是一个抽象类,用于自定义适配器(Adapter),它允许你更灵活地控制 ListView(或其它使用适配器的组件如 GridView, Spinner 等)的数据绑定和视图生成。BaseAdapter 提供了比 ArrayAdapter 或 SimpleAdapter 更高的自由度,因为它要求开发者实现几个关键方法来定义如何展示数据。主要需要实现的方法
int getCount():返回数据集中的元素总数。
Object getItem(int position):根据指定的位置返回数据集中对应的项。
long getItemId(int position):获取指定位置项的行ID。
View getView(int position, View convertView, ViewGroup parent):为每一项生成视图。这里可以重用 convertView 来提高性能,并且可以使用 ViewHolder 模式优化列表滚动性能。
public class MainActivity extends AppCompatActivity{
// 定义图标数组
private int[] icons ={R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table};
// 定义名称数组
private String[] names={"苹果","蛋糕","衣服","jvav","猕猴桃","桌子"};
// 定义价格数组
private String[] prices={"8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 启用EdgeToEdge
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;
});
// 获取ListView
ListView lv = findViewById(R.id.lv);
// 创建适配器
MyAdapter adapter = new MyAdapter();
// 设置适配器
lv.setAdapter(adapter);
}
// 自定义适配器
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// 返回名称数组的长度
return names.length;
}
@Override
public Object getItem(int position) {
// 返回名称数组中指定位置的元素
return names[position];
}
@Override
public long getItemId(int position) {
// 返回指定位置的索引
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 获取布局
View view = View.inflate(MainActivity.this, R.layout.list_item, null);
// 获取ImageView
ImageView iv = view.findViewById(R.id.iv);
// 获取TextView
TextView tv1 = view.findViewById(R.id.tv1);
TextView tv2 = view.findViewById(R.id.tv2);
// 设置TextView的文本
tv1.setText(names[position]);
tv2.setText(prices[position]);
// 设置ImageView的背景
iv.setBackgroundResource(icons[position]);
return view;
}
}
}
结果:
这段代码是从 BaseAdapter
的 getView
方法中摘录的,用于在 ListView
中高效地生成和重用视图项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null){
// 获取布局
convertView= View.inflate(MainActivity.this, R.layout.list_item, null);
holder = new ViewHolder();
// 获取ImageView
holder.iv = convertView.findViewById(R.id.iv);
// 获取TextView
holder.tv1 = convertView.findViewById(R.id.tv1);
holder.tv2 = convertView.findViewById(R.id.tv2);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
// 设置TextView的文本
holder.tv1.setText(names[position]);
holder.tv2.setText(prices[position]);
// 设置ImageView的背景
holder.iv.setBackgroundResource(icons[position]);
return convertView;
}
class ViewHolder{
TextView tv1,tv2;
ImageView iv;
}
RecyclerView
RecyclerView 是 Android 提供的一个用于显示大量数据集的高级控件,旨在替代传统的 ListView 和 GridView。它提供了更灵活、更高效的方式来展示和管理列表项,并支持多种布局方式
主要特点
- 视图复用:通过 ViewHolder 模式实现高效的视图复用,减少 findViewById 调用次数,提高性能。
- 布局管理器:支持多种布局方式,包括线性布局(垂直或水平)、网格布局和瀑布流布局。
- 动画效果:内置了丰富的动画效果,可以轻松添加插入、删除和移动项目的动画。
- 模块化设计:将数据适配、布局管理和项目装饰等功能分离,使得代码更加清晰和易于维护。
用途
- 展示大量数据:适用于需要展示大量数据的应用场景,如联系人列表、消息列表等。
- 复杂布局:支持复杂的布局方式,如网格布局和瀑布流布局,适合展示图片库、商品列表等。
- 动态更新:支持数据的动态更新,并且可以自定义动画效果来增强用户体验。
active_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="none"> </androidx.recyclerview.widget.RecyclerView> </LinearLayout>
recycler_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="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/iv" android:layout_width="60dp" android:layout_height="60dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="vertical"> <TextView android:id="@+id/tv1" android:layout_width="match_parent" android:layout_height="35dp" android:textSize="25dp" android:text="名称"/> <TextView android:id="@+id/tv2" android:layout_width="match_parent" android:layout_height="25dp" android:text="解释" /> </LinearLayout> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{ // 定义图标数组 private int[] icons ={R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table,R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table}; // 定义名称数组 private String[] names={"苹果","蛋糕","衣服","jvav","猕猴桃","桌子","苹果","蛋糕","衣服","jvav","猕猴桃","桌子"}; // 定义价格数组 private String[] prices={"8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张","8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启用EdgeToEdge 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; }); // 获取ListView RecyclerView rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); // 创建适配器 MyAdapter adapter = new MyAdapter(); // 设置适配器 rv.setAdapter(adapter); } // 自定义适配器 class MyAdapter extends RecyclerView.Adapter<MainActivity.ViewHolder> { @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 从parent中获取LayoutInflater,并使用R.layout.list_item作为布局文件,创建ViewHolder对象 return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false)); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 设置第一个TextView的内容为names数组中对应位置的元素 holder.tv1.setText(names[position]); // 设置第二个TextView的内容为prices数组中对应位置的元素 holder.tv2.setText(prices[position]); // 设置ImageView的背景为icons数组中对应位置的元素 holder.iv.setBackgroundResource(icons[position]); } @Override // 重写父类的方法 public int getItemCount() { // 返回names数组的长度 return names.length; } } class ViewHolder extends RecyclerView.ViewHolder{ // 定义TextView和ImageView TextView tv1,tv2; ImageView iv; // 构造方法,传入itemView public ViewHolder(@NonNull View itemView) { super(itemView); // 通过findViewById方法获取TextView和ImageView tv1 = itemView.findViewById(R.id.tv1); tv2 = itemView.findViewById(R.id.tv2); iv = itemView.findViewById(R.id.iv); } } }
结果:
------ END------