Android开发--Lesson02--常见的控件

news/2025/3/16 13:07:31/文章来源:https://www.cnblogs.com/5ran2yl/p/18774239

一.简单空间

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;}}
}

 

结果:

 这段代码是从 BaseAdaptergetView 方法中摘录的,用于在 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------

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899769.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI编程:最疯狂的MCP服务器你一定要试试

我还记得我第一次听说MCP(模型上下文协议)的时候,我心想: “哈?又一个花里胡哨的缩写,这个世界已经快被这些缩写淹没了!” 但当我意识到MCP就像AI界的通用连接器——就像USB-C之于手机和笔记本电脑——我瞬间兴奋了。 再也不用折腾那些只能在某个地方工作的插件或奇怪的…

20241217实验一《Python程序设计》实验报告

20241217 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2412 姓名: 黄迅 学号:20241217 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

域自适应

信息时代产生的大量数据使机器学习技术成功地应用在许多领域。大多数机器学习技术需要满足训练集与测试集独立同分布的假设,但在实际应用中这个假设很难满足。 域适应是一种在训练集和测试集不满足独立同分布条件下的机器学习技术。一般情况下的域适应只适用于源域目标域特征空…

JDK8-时间格式化类-时区类-工具类--java进阶day07

1.时间格式化类:DateTimeFormatter1.创建方式 使用DateTimeFormatter调用ofPattern方法即可. 2.格式化方法创建好DateTimeFormatter对象后,调用format方法,将要格式化的日期对象放入即可.3.日期字符串解析 将一个日期字符串变为日期,需要用到日历类对象,调用它的parse方法…

无人机仿真环境介绍及其配置

博客地址:https://www.cnblogs.com/zylyehuo/参考 https://space.bilibili.com/393165606/channel/collectiondetail?sid=1750583&spm_id_from=333.788.0.0仿真器 VS 模拟器目录为什么要学习 ROS 发展现状课程介绍ROS 是什么 历史起源总体设计 一个目标五个特点点对点的设…

为什么 AI 在处理新闻方面如此糟糕

托马斯史密斯插画来源:Ideogram新闻流淌在我的血液里。我的日常工作是一家新闻摄影机构的负责人,而我的主网站是一个专注于旧金山湾区新闻的站点。 我与新闻内容息息相关,所以我对 AI 在处理新闻方面的糟糕表现感受尤为深刻。 哥伦比亚新闻评论(Columbia Journalism Review…

活动回顾 - 《开源智能搜索与知识库管理 - Coco AI》直播活动圆满结束,附 PPT 下载与视频回放

2025 年 03 月 07 日,由搜索客社区和极限科技(INFINI Labs)联合举办的第 7 期线上 Meetup 技术交流直播活动圆满结束。本期 Meetup 直播活动吸引了超过 700+ 技术爱好者观看参与,活动主要介绍了极限科技新推出并正在研发的开源智能搜索产品 Coco AI 的技术特点和应用场景,…

一文带你搞懂SpringBoot项目实现自动化部署

前言要实现springboot项目自动化部署,需要了解下面四个技术点:SpringBoot Profiles Maven命令 Jenkins的使用 Shell脚本下面我们会一一来介绍这四个技术点,最后用一个综合事例来给大家呈现springboot项目的自动化部署。1. SpringBoot Profilesprofiles 是 Spring 框架的一种…

centos更改命令提示符颜色

PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"永久生效vim /etc/profile.d/test.sh PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"效果: PS1的定义中个常…

P1600 [NOIP 2016 提高组] 天天爱跑步解析

思维难度:cf2300+ 实现方案:贡献计算 方法:线段树合并或者树上差分+桶的统计 思路点补充: 按照题目的设定,如果一个观察员 \(j\) 能够观察到某个人经过,说明 \(j\)一定在第 \(i\)个人的路径上。 树上的路径是唯一确定的,由此可以得到两种情况。 情况一:观察员 \(j\) 此…

C#语言碎片:Switch-Case语句字符串匹配

Switch case语句在处理字符串类型匹配时候,case条件需要设置为静态常量或者一个具体的字符串:因为工具类ToolHand.Name 为变量,所以编译不通过。 使用if语句来逐个判断:看AI对此的解释:C#的switch语句在条件匹配之所以要用静态常量是因为,编译时常量(const)在编译时就被…

TaskPyro:一个轻量级的 Python 任务调度和爬虫管理平台

爬虫管理系统,爬虫管理平台,可视化操作,完整监控,灵活的Python环境管理,,环境隔离,资源占用小,支持 Scrapy 等主流爬虫框架,支持 Selenium、Playwright、DrissionPage 等浏览器自动化工具,支持node环境下的js逆向代码前言 推荐一款本人在使用的Python爬虫管理平台,亲测不错!!…