本文共 6258 字,大约阅读时间需要 20 分钟。
在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。这时候最方便的方法就是使用灵活的适配器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文件,在其中填充如下代码片段:
在res/layout/目录下新建一个custom_baseadapter_item.xml的列表项布局文件,其代码如下:
考虑到每个列表项都可以是一个非常复杂的实体对象,用一个实体类更方便数据管理。创建一个类,代码如下:
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 mDatas; // 列表数据集合 private int mResId; // 列表项布局文件ID // 构造方法 public MyBaseAdapter(Context context, List 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 getData() { List 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零基础入门第2节:
Android零基础入门第3节:
Android零基础入门第4节:
Android零基础入门第5节:
Android零基础入门第6节:
Android零基础入门第7节:
Android零基础入门第8节:
Android零基础入门第9节:
Android零基础入门第10节:
Android零基础入门第11节:
Android零基础入门第12节:
Android零基础入门第13节:
Android零基础入门第14节:
Android零基础入门第15节:
Android零基础入门第16节:
Android零基础入门第17节:
Android零基础入门第18节:
Android零基础入门第19节:
Android零基础入门第20节:
Android零基础入门第21节:
Android零基础入门第22节:
Android零基础入门第23节:
Android零基础入门第24节:
Android零基础入门第25节:
Android零基础入门第26节:
Android零基础入门第27节:
Android零基础入门第28节:
Android零基础入门第29节:
Android零基础入门第30节:
Android零基础入门第31节:
Android零基础入门第32节:
Android零基础入门第33节:
Android零基础入门第34节:
Android零基础入门第35节:
Android零基础入门第36节:
Android零基础入门第37节:
Android零基础入门第38节:
Android零基础入门第39节:
Android零基础入门第40节:
Android零基础入门第41节: