博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android零基础入门第42节:自定义BaseAdapter
阅读量:6616 次
发布时间:2019-06-25

本文共 6258 字,大约阅读时间需要 20 分钟。

原文:

    在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文件,在其中填充如下代码片段:

    在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节:

你可能感兴趣的文章
tcp 三次握手
查看>>
XML中添加换行符
查看>>
在C#中使用属性控件添加属性窗口
查看>>
printf()详解之终极无惑
查看>>
交叉检验---训练数据,验证数据和测试数据
查看>>
AspNetPager分页控件配置
查看>>
备胎的养成记KeepAlived实现热备负载
查看>>
相等与全等
查看>>
VS无法设置断点的解决方案
查看>>
Android -- 再来一发Notification
查看>>
从尾到头打印链表
查看>>
【hibernate】 hibernate的主键策略
查看>>
单表代替密码原理及算法实现
查看>>
如何让VS检查函数和类Comment的添加情况
查看>>
Linq案例
查看>>
制作播放视频关灯效果
查看>>
【POI】解析xls报错:java.util.zip.ZipException: error in opening zip file
查看>>
我的第一个Node web程序
查看>>
【IntelliJ Idea】idea下hibernate反向生成工具,根据数据表生成实体
查看>>
第 8 章 Spring Data
查看>>