在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。
一、使用BaseAdapter
BaseAdapter是Android应用程序中经常用到的基础数据适配器的基类,它实现了Adapter接口。其主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件进行显示。
由于BaseAdapter是一个抽象类,所以使用BaseAdapter时必须有一个类继承它,并实现它的方法。BaseAdapter的灵活性就在其要重写的很多方法,常会重写的几个方法如下。
-
int getCount():主要是获得列表项的数量。
-
Object getItem(int position):主要是获得当前列表项。
-
long getItemId(int position):主要是获得当前列表项的ID。
-
View getView(int position, View convertView, ViewGroup parent):主要是获得第position处的列表项组件。
二、示例
接下来通过一个示例程序来学习如何自定义BaseAdapter创建ListView。
继续使用WidgetSample工程,在app/main/res/layout/目录下创建custom_baseadapter_layout.xml文件,在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
在res/layout/目录下新建一个custom_baseadapter_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/icon_img" android:layout_width="50dp" android:layout_height="50dp" android:padding="5dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/title_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" /> <TextView android:id="@+id/info_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="10sp" /> </LinearLayout> </LinearLayout>
考虑到每个列表项都可以是一个非常复杂的实体对象,用一个实体类更方便数据管理。创建一个类,代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample.entity; /** * @创建者 鑫鱻 * @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert */ public class Data { private int icon; // 图标数据 private String title; // 标题数据 private String info; // 信息描述数据 // 构造方法 public Data() { } public Data(int icon, String title, String info) { this.icon = icon; this.title = title; this.info = info; } // Getter和Setter方法 public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
创建一个MyBaseAdapter类,继承BaseAdapter类,重写其4个主要方法,具体代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.jinyu.cqkxzsxy.android.listviewsample.R; import com.jinyu.cqkxzsxy.android.listviewsample.entity.Data; import java.util.List; /** * @创建者 鑫鱻 * @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert */ public class MyBaseAdapter extends BaseAdapter { private Context mContext; // 上下文环境 private List<Data> mDatas; // 列表数据集合 private int mResId; // 列表项布局文件ID // 构造方法 public MyBaseAdapter(Context context, List<Data> datas, int resId) { this.mContext = context; this.mDatas = datas; this.mResId = resId; } // 获得列表项的数量 @Override public int getCount() { return mDatas.size(); } // 获得当前列表项 @Override public Data getItem(int position) { return mDatas.get(position); } // 获得当前列表项的ID @Override public long getItemId(int position) { return position; } // 获得第position处的列表项组件 @Override public View getView(int position, View convertView, ViewGroup viewGroup) { // 获取LayoutInflater对象 LayoutInflater inflater = LayoutInflater.from(mContext); // 装载列表项视图 View itemView = inflater.inflate(mResId, null); // 获取列表项组件 ImageView iconImg = (ImageView) itemView.findViewById(R.id.icon_img); TextView titleTv = (TextView) itemView.findViewById(R.id.title_tv); TextView infoTv = (TextView) itemView.findViewById(R.id.info_tv); // 给列表项赋值 Data data = getItem(position); if(null != data) { iconImg.setImageResource(data.getIcon()); titleTv.setText(data.getTitle()); infoTv.setText(data.getInfo()); } return itemView; } }
上面程序中最重要的就是getView()方法,其返回列表项组件。
接下来为ListView提供Adapter,使用自定义的BaseAdapter决定ListView所要显示的列表项。新建CustomBaseAdapterActivity.java文件,加载上面新建的布局文件,具体代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ListView; import com.jinyu.cqkxzsxy.android.listviewsample.adapter.MyBaseAdapter; import com.jinyu.cqkxzsxy.android.listviewsample.entity.Data; import java.util.ArrayList; import java.util.List; public class CustomBaseAdapterActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.custom_baseadapter_layout); // 获取界面组件 ListView listView = (ListView) findViewById(R.id.listview); // 将数组包装为自定义MyBaseAdapter MyBaseAdapter adapter = new MyBaseAdapter(this, getData(), R.layout.custom_baseadapter_item); // 为ListView设置Adapter listView.setAdapter(adapter); } /** * 获取列表数据 * @return */ private List<Data> getData() { List<Data> datas = new ArrayList<>(); datas.add(new Data(R.drawable.item_01, "小宗", "电台DJ")); datas.add(new Data(R.drawable.item_02, "貂蝉", "四大美女")); datas.add(new Data(R.drawable.item_03, "奶茶", "清纯妹妹")); datas.add(new Data(R.drawable.item_04, "大黄", "是小狗")); datas.add(new Data(R.drawable.item_05, "hello", "every thing")); datas.add(new Data(R.drawable.item_06, "world", "hello world")); return datas; } }
可以发现使用自定义BaseAdapter创建ListView,界面交互代码非常简洁,却可以实现非常复杂的界面。
运行程序,可以看到下图所示界面效果。
至此,关于ListView中常用的几个Adapter基本学习完毕,如果还没有掌握建议回头再多练习。从下一期开始来优化我们的ListView,提供我们的Android程序运行效率。
今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!
此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!
往期总结分享:
Android零基础入门第1节:Android的前世今生
Android零基础入门第2节:Android 系统架构和应用组件那些事
Android零基础入门第3节:带你一起来聊一聊Android开发环境
Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招
Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神
Android零基础入门第6节:配置优化SDK Manager, 正式约会女神
Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点
Android零基础入门第9节:Android应用实战,不懂代码也可以开发
Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio
Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌
Android零基础入门第13节:Android Studio配置优化,打造开发利器
Android零基础入门第14节:使用高速Genymotion,跨入火箭时代
Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
Android零基础入门第16节:Android用户界面开发概述
Android零基础入门第17节:TextView属性和方法大全
Android零基础入门第18节:EditText的属性和使用方法
Android零基础入门第19节:Button使用详解
Android零基础入门第20节:CheckBox和RadioButton使用大全
Android零基础入门第21节:ToggleButton和Switch使用大全
Android零基础入门第22节:ImageView的属性和方法大全
Android零基础入门第23节:ImageButton和ZoomButton使用大全
Android零基础入门第24节:自定义View简单使用,打造属于你的控件
Android零基础入门第25节:简单且最常用的LinearLayout线性布局
Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同
Android零基础入门第27节:正确使用padding和margin
Android零基础入门第28节:轻松掌握RelativeLayout相对布局
Android零基础入门第29节:善用TableLayout表格布局
Android零基础入门第30节:两分钟掌握FrameLayout帧布局
Android零基础入门第31节:少用的AbsoluteLayout绝对布局
Android零基础入门第32节:新推出的GridLayout网格布局
Android零基础入门第33节:Android事件处理概述
Android零基础入门第34节:Android中基于监听的事件处理
Android零基础入门第35节:Android中基于回调的事件处理
Android零基础入门第36节:Android系统事件的处理
Android零基础入门第37节:初识ListView
Android零基础入门第38节:初识Adapter
Android零基础入门第39节:ListActivity和自定义列表项
Android零基础入门第40节:自定义ArrayAdapter
Android零基础入门第41节:使用SimpleAdapter