一.简单空间
TextView
TextView用来显示文本信息,可以在XML文件中添加并且添加其相对的样式:
它的样式主要有以下内容:
<TextViewandroid: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 属性或代码自定义按钮的外观,包括文本、颜色、背景等。
事件处理举例:
<Buttonandroid: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() {@Overridepublic void onClick(View v) {// 处理点击事件}
});
第二种方式:不在XML文件中放置onClick事件,而是直接在Java代码中直接实现类的方式绑定事件
//使用Java代码绑定事件Button btn = findViewById(R.id.bt);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {btn.setText("被点击了");}});
第三种方式实现View.OnClickListener接口,同时重写其方法
public class MainActivity extends AppCompatActivity implements View.OnClickListener{@Overrideprotected 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);//自己就是监听器的实现类,故而将自己丢入监听器中}@Overridepublic 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"><EditTextandroid:id="@+id/et"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入内容"android:inputType="textPersonName" /><TextViewandroid: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" /><Buttonandroid:id="@+id/bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="click me"/> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{@Overrideprotected 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() {@Overridepublic void onClick(View v) {EditText et = findViewById(R.id.et);//获取EditTextTextView tv = findViewById(R.id.tv);//获取ViewTexttv.setText(et.getText().toString());//点击按钮后写入内容到ViewText中}});}
}
ImageView
在Android开发中,ImageView 是一个非常常用的UI组件,主要用于展示图像内容。它能够加载并显示各种来源的图片,如资源文件、网络图片或内存中的位图等。
作用
显示图片:最基本的功能是用于显示图片,支持多种格式(如PNG、JPG等)。
调整图片大小和比例:通过属性设置,可以控制图片的缩放模式、裁剪方式等,以适应不同的布局需求。
标签格式如下:
<!-- 在布局文件中 --> <ImageViewandroid: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"><RadioGroupandroid:id="@+id/rgp"android:layout_width="match_parent"android:layout_height="wrap_content"><RadioButtonandroid:id="@+id/rb1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="男"/><RadioButtonandroid:id="@+id/rb2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="女"/><RadioButtonandroid:id="@+id/rb3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="沃尔玛购物袋"/></RadioGroup><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="你选择的是:"/> </LinearLayout>
Java代码:
public class MainActivity extends AppCompatActivity{@Overrideprotected 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() {@Overridepublic 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"><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="您选择的是:"/><CheckBoxandroid:id="@+id/cb1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="basketball"/><CheckBoxandroid:id="@+id/cb2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="pingpong"/><CheckBoxandroid:id="@+id/cb3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="music"/><CheckBoxandroid: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{//拿取到TextViewprivate TextView tv;private String msg="你选择的是:";@Overrideprotected 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);}@Overridepublic 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"> <Buttonandroid: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{@Overrideprotected 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() {@Overridepublic 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{@Overrideprotected 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() {//确定事件@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();MainActivity.this.finish();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {//取消事件@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 将选中的项赋值给whwh = which;}})// 设置确定按钮,并设置点击事件.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 定义字体大小数组int[] fontSize = {10, 20, 30, 40, 50};// 设置字体大小 tv.setTextSize(fontSize[wh]);// 关闭对话框 dialog.dismiss();}})// 设置取消按钮,并设置点击事件.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 关闭对话框 dialog.dismiss();}});// 创建AlertDialog对象alertDialog =builder.create();// 显示对话框 alertDialog.show();}});} }
结果视图:
多选对话框
选对话框(Checkbox Dialog)允许用户从一组选项中选择多个选项。与单选对话框不同,它不限制用户的选项数量,适用于需要用户做出多项选择的场景作用
- 提供一种方式让用户能够选择一个或多个选项。
- 特别适合于那些需要收集用户偏好或配置信息的应用场景。
示例案例
Java代码:
public class MainActivity extends AppCompatActivity{@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {// 将选中的项保存到ba数组中ba[which]=isChecked;}})// 设置AlertDialog的确定按钮.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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() {@Overridepublic 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"><ListViewandroid: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"><ImageViewandroid:id="@+id/iv"android:layout_width="60dp"android:layout_height="60dp"android:src="@drawable/ic_launcher_background"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="vertical"><TextViewandroid:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="30dp"android:text="名称"/><TextViewandroid: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元/张"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 启用EdgeToEdgeEdgeToEdge.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;});// 获取ListViewListView lv = findViewById(R.id.lv);// 创建适配器MyAdapter adapter = new MyAdapter();// 设置适配器lv.setAdapter(adapter);}// 自定义适配器class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {// 返回名称数组的长度return names.length;}@Overridepublic Object getItem(int position) {// 返回名称数组中指定位置的元素return names[position];}@Overridepublic long getItemId(int position) {// 返回指定位置的索引return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 获取布局View view = View.inflate(MainActivity.this, R.layout.list_item, null);// 获取ImageViewImageView iv = view.findViewById(R.id.iv);// 获取TextViewTextView 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
中高效地生成和重用视图项
@Overridepublic 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();// 获取ImageViewholder.iv = convertView.findViewById(R.id.iv);// 获取TextViewholder.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.RecyclerViewandroid: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"><ImageViewandroid:id="@+id/iv"android:layout_width="60dp"android:layout_height="60dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="vertical"><TextViewandroid:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="35dp"android:textSize="25dp"android:text="名称"/><TextViewandroid: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元/张"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 启用EdgeToEdgeEdgeToEdge.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;});// 获取ListViewRecyclerView 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@Overridepublic 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));}@Overridepublic 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和ImageViewTextView tv1,tv2;ImageView iv;// 构造方法,传入itemViewpublic ViewHolder(@NonNull View itemView) {super(itemView);// 通过findViewById方法获取TextView和ImageViewtv1 = itemView.findViewById(R.id.tv1);tv2 = itemView.findViewById(R.id.tv2);iv = itemView.findViewById(R.id.iv);}} }
结果:
------ END------