ListView的基础用法

article/2025/9/26 10:13:56

最近学到ListView和RecyclerView,感觉有点难理解,于是自己找到了篇文章,感觉写的挺详细的(文章链接在文末),然后自己再整理敲了跑了一遍,总结了一下,方便自己以后回头温习。

一个ListView的创建需要三个元素

  1. ListView每一列的View
  2. 填入View的每一项数据(图片,文字等)
  3. 连接数据与ListView的适配器

什么是适配器?

适配器是一个连接数据和AdapterView(ListView、RecyclerView等)的桥梁,通过它能有效地实现数据与AdaperView的分离设置,使得AdapterView与数据的绑定更加简便,修改更方便。

1. ListView使用ArrayAdapter

默认情况下,ArrayAdapter绑定每一个对象的toString值到layout中预先定义的TextView控件上。

例子

在activity_main_xml布局文件中加入一个ListView控件

<?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"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

在MainActivity中进行初始化

public class MainActivity extends AppCompatActivity {//用一个数组来listView的每一项数据private String[] s = {"aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii"};private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过id找到listView对象listView = findViewById(R.id.listView);//给listView设置ArrayAdapter,绑定数据listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, s));}
}

在这里插入图片描述

步骤:

  1. 建立一个String类型的数据作为每一项Item的显示数据

  2. 初始化listView对象

  3. 给listView设置适配器,并通过ArrayAdapter的构造器绑定数据

    例子中使用的ArrayAdapter构造器有三个参数,第一个参数是上下文,可以传一个当前对象this,第二个参数是布局资源(必须要有TextView控件),例子里用的是系统自带的android.R.layout.simple_list_item_1(还有几种常用的:android.R.layout.simple_list_item_checked、android.R.layout.simple_list_item_multiple_choice、android.R.layout.simple_list_item_single_choice),第三个参数是ListView的具体内容,例子就用的一个字符串数组。

android.R.layout.simple_list_item_checked:实现带选择框的ListView,用setChoiceMode()方法设定选择为多选还是单选

listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, s));
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

在这里插入图片描述

android.R.layout.simple_list_item_multiple_choice:实现带CheckBox的ListView

listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice, s));
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

在这里插入图片描述

android.R.layout.simple_list_item_single_choice:实现带RadioButton的ListView

listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice, s));
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

在这里插入图片描述

ListView绑定监听器

//绑定监听器listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Toast.makeText(MainActivity.this, "你点击了第" + i + "行", Toast.LENGTH_SHORT).show();}});

2. ListView使用SimpleAdapter

使用simpleAdapter可以自定义ListView中的item的内容,比如图片等。下面的例子就用上了ImageView和TextView

例子

定义每一个item的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="100dp"android:layout_margin="10dp"><ImageViewandroid:id="@+id/imageView"android:layout_width="100dp"android:layout_height="match_parent"/><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:textSize="20sp"/></LinearLayout>

修改MainActivity中的代码

public class MainActivity extends AppCompatActivity {private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过id找到listView对象listView = findViewById(R.id.listView);ArrayList<HashMap<String, Object>> listItem = new ArrayList<>();for (int i = 0; i < 10; i++) {HashMap<String, Object> map = new HashMap<>();//加入图片map.put("ItemImage", R.drawable.image);map.put("ItemText", "这是第"+i+"行");listItem.add(map);}SimpleAdapter adapter = new SimpleAdapter(this,//绑定的数据listItem,//每一行的布局R.layout.item,//动态数组中的数据源的键映射到布局文件对应的控件中new String[] {"ItemImage", "ItemText"},new int[] {R.id.imageView, R.id.textView});listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Toast.makeText(MainActivity.this, "你点击了第" + i + "行", Toast.LENGTH_SHORT).show();}});}
}

使用SimpleAdapter的数据一般都是用HashMap构成的ArrayList,列表的每一项对应ListView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件中对应控件上。

在这里插入图片描述

步骤:

  1. 自定义ListView的每一个item的布局
  2. 定义一个HashMap构成的动态数组,数据以键值对的形式存储
  3. 创建一个适配器对象,有五个构造参数:上下文、每一个item的布局、HashMap的键、布局控件的id
  4. 将ListView绑定到SimpleAdapter上

3. ListView使用BaseAdapter、ListView的优化

修改item.xml代码,把ImageView改为Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"android:textAllCaps="false"android:focusable="false"/><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:textSize="20sp"/></LinearLayout>

BaseAdapter是一个抽象类,要写一个类继承它,下面代码自定义一个内部类MyAdapter继承BaseAdapter

MainActivity代码:

public class MainActivity extends AppCompatActivity {private ListView listView;ArrayList<HashMap<String, Object>> listItem;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过id找到listView对象listView = findViewById(R.id.listView);MyAdapter myAdapter = new MyAdapter(this);listView.setAdapter(myAdapter);//为ListView添加点击事件listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Log.v("MyListViewBase", "你点击了ListView条目" + i);}});}/*** 获取数据的方法* @return*/private ArrayList<HashMap<String, Object>> getDate() {ArrayList<HashMap<String, Object>> list = new ArrayList<>();//添加数据for (int i = 0; i < 30; i++) {HashMap<String, Object> map = new HashMap<>();map.put("textView", "这是第" + i + "行");list.add(map);}return list;}/*** 新建一个MyAdapter类,继承BaseAdapter*/private class MyAdapter extends BaseAdapter {//声明一个LayoutInflater对象用于导入布局private LayoutInflater mInflater;public MyAdapter(Context context) {mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return getDate().size();}@Overridepublic Object getItem(int i) {return null;}@Overridepublic long getItemId(int i) {return 0;}@Overridepublic View getView(final int i, View view, ViewGroup viewGroup) {ViewHolder holder;//观察convertView随ListView滚动情况Log.v("MyListViewBase", "getView" + i + " " + view);if (view == null) {view = mInflater.inflate(R.layout.item, null);holder = new ViewHolder();holder.button = view.findViewById(R.id.button);holder.textView = view.findViewById(R.id.textView);//绑定ViewHolder对象view.setTag(holder);} else {//取出ViewHolder对象holder = (ViewHolder) view.getTag();}//设置TextView显示的内容,即我们存放在动态数组中的数据holder.textView.setText(getDate().get(i).get("textView").toString());//为Button添加点击事件holder.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.v("MyListViewBase", "你点击了按钮" + i);}});return view;}}public final class ViewHolder {public Button button;public TextView textView;}}

需要注意的是,在定义点击事件的时候,Button会抢夺ListView的焦点,需要将Button设置为没有焦点,在item.xml文件中,在Button里加入一行android:focusable="false"即可

在这里插入图片描述

参考文章:https://blog.csdn.net/xhbxhbsq/article/details/53487456


http://chatgpt.dhexx.cn/article/89BkTVOi.shtml

相关文章

Android(14) ArrayAdapter(数组适配器)的三种方法

ArrayAdapter数组适配器用于绑定格式单一的数据&#xff0c;数据源可以是集合或者数组 列表视图(ListView)以垂直的形式列出需要显示的列表项。 实现过程&#xff1a;新建适配器->添加数据源到适配器->视图加载适配器 第一种&#xff1a;直接用ListView组件创建 列表…

Android——列表视图(ListView)

1、什么是ListView&#xff1f;它可以实现怎样的功能&#xff1f; 列表视图是android中最常用的一种视图组件&#xff0c;它以垂直列表的形式列出需要显示的列表项。手机屏幕空间有限&#xff0c;能显示的内容不多。可以借助ListView来显示更多、更丰富的内容。ListView允许用…

ListView详细介绍与使用

前言介绍&#xff1a; 关于 ListView 我们大家都应该是非常的熟悉了&#xff0c;在 Android 开发中是经常用到的&#xff0c;今天就再来回顾一下&#xff0c;ListView 的使用方法&#xff0c;和一些需要优化注意的地方&#xff0c;还有日常开发过程中的一些小技巧和经验。 Li…

Android最常用的控件ListView(详解)

一.ListView简介 在Android开发中&#xff0c;ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容&#xff0c;并且能够根据数据的长度自适应屏幕显示。 二.ListView简单用法 代码部分 1.布局界面 activity_main.xml 代码&#xff1a; <?xml version"1…

ListView的用法

一、 ListView的使用 <ListView>:用于展示大量数据的一种列表视图,通过上下滑动的方式将屏幕外的数据滚动到屏幕内。 数据无法直接传递给ListView,需要适配器 Adapter:作用是将各种数据以合适的形式展示到View上 实例&#xff1a; Food.java: public class Food {priv…

Android原生AlertDialog修改标题,内容,按钮颜色,字体大小等

private void showAlerDialog() {AlertDialog dialog new AlertDialog.Builder(this).setTitle("AlerDialog").setMessage("这是一个AlertDialog").setPositiveButton("确定",null).setNegativeButton("取消",null).create();dialog.…

【android学习】Dialog对话框

1&#xff0c;Dialog 1&#xff09;onCreateDialog(int) 2&#xff09;showDialog(int) 第一次请求时&#xff0c;会从Activity中调用onCreateDialog。 3&#xff09;onPrepareDialog(int,Dialog) 在每次打开对话框时被调用。 4&#xff09;dismissDialog(int) 关闭对话…

Android Dialog使用详解

对话框是提示用户作出决定或输入额外信息的小窗口&#xff0c;通常不会填充整个屏幕&#xff0c;用于进行一些额外交互 Dialog 类是对话框的基类&#xff0c;但应该避免直接实例化 Dialog&#xff0c;而应使用其子类&#xff0c;比如 AlertDialog 此对话框可显示标题、提示信…

Android 修改AlertDialog原生setPositiveButton的字体颜色背景颜色大小边距位置

看效果图&#xff1a; public void lanyaClick(View v) {//点击确定之后转向登陆框LayoutInflater factory LayoutInflater.from(Beforestart.this);//得到自定义对话框final View DialogView factory.inflate(R.layout.item_alert_dialog, null);//创建对话框android.app.Al…

setPositiveButton和setNegativeButton的区别

setPositiveButton和setNegativeButton的区别和setNeutralButton的区别 三者都是AlertDialog弹出框的按钮&#xff0c;都是封装好的button&#xff0c;只是显示的位置不同&#xff0c;项目中可根据情况选择使用&#xff0c;setNegativeButton一般用于确认&#xff0c;setNegat…

GPS(rinex格式)数据解析详细解读

RINEX格式现如今已成为GPS测量应用中的标准数据格式&#xff0c;目前应用最为广泛、最普遍的是RINEX格式的第2个版本&#xff0c;该版本能够用于包括静态和动态GPS测量在内的不同观测模式数据。在该版本中定义了6种不同类型的数据文件&#xff0c;分别用于存放不同类型的数据&a…

2020/10/23 GPS的数据格式学习

GPS的数据格式学习 一、在使用GPS的通过串口向电脑发送数据的时候&#xff0c;要注意GPS数据线的连接&#xff1b; 1.1 VCC接VCC&#xff1b;&#xff08;VCC表示接电源正极&#xff09; 1.2 GND接GND&#xff1b;&#xff08;GND表示接地或接电源负极&#xff09; 1.3 TX接RX…

GPS数据包格式+数据解析

GPS数据包格式数据解析 一、全球时区的划分&#xff1a; 每个时区跨15经度。以0经线为界向东向西各划出7.5经度&#xff0c;作为0时区。即0时区的经度范围是7.5W——7.5E。从7.5E与7.5W分别向东、向西每15经度划分为一个时区&#xff0c;直到东11区和西11区。东11区最东部的经度…

GPS研究---GPS 数据格式

GPS 数据处理时所采用的观测数据是来自观测的 GPS 接收机。由于接收机的型号很多&#xff0c;厂商设计的数据格式各不相同&#xff0c;国际上为了能统一使用不同接收机的数据&#xff0c; 设计了一种与接收机无关的 RINEX(The Receiver Independent Exchange Format)格式&#…

GPS数据格式的分析

文章目录 前言一、数据格式解析1、GPGGA2、GPRMC3、GPCHC4、Kitti数据集oxts数据 二、驱动1、功能包1.1 解析GPGGA1.2 华测GPCHC 2、ROS相关消息类型2.1 sensor_msgs::NavSatFix2.2 gps_common::GPSFix2.3 sensor_msgs::Imu 3、驱动思路 三、时间1、UTC时间2、时间戳 前言 GPS…

GPS GLONASS数据文件类型解析

GPS & GLONASS数据文件类型解析 一、GPS数据格式 RINEX格式现如今已成为GPS测量应用中的标准数据格式&#xff0c;目前应用最为广泛、最普遍的是RINEX格式的第2个版本&#xff0c;该版本能够用于包括静态和动态GPS测量在内的不同观测模式数据。在该版本中定义了6种不同类…

GPS的数据格式介绍

GPRMC&#xff08;建议使用最小GPS数据格式&#xff09; $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11><CR><LF> 1) 标准定位时间&#xff08;UTC time&#xff09;格式&#xff1a…

Android ExpandableListView

ExpandableListView可以显示一个视图垂直滚动显示两级列表中的条目&#xff0c;这不同于列表视图&#xff08;ListView&#xff09;。ExpandableListView允许有两个层次&#xff1a;一级列表中有二级列表。 比如在手机设置中&#xff0c;对于分类&#xff0c;有很好的效果。手机…

ExpandableListView用法

先上个效果图&#xff1a; 1&#xff0c;我用的fragment import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.dami.student.ui.chatui.adapter.ContactsExpandableListAdapter; import com.dami.student.R; import android.conten…

android expandablelistview简单应用,android ExpandableListView简单例子

android中常常要用到ListView&#xff0c;有时也要用到ExpandableListView&#xff0c;如在手机设置中&#xff0c;对于分类有很好的效果&#xff0c;会用ListView的人一定会用ExpandableListView&#xff0c;因为 ExpandableListView extends ListView的&#xff0c;下面来看个…