• Android零基础入门第42节:自定义BaseAdapter


        在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

  • 相关阅读:
    完整性检查工具Nabou
    Linux下使用网上银行
    戏说Linux商用数据库
    开源数据库“五虎将”
    搜寻Linux软件实用指南
    认识Linux瘦客户机
    一款开源Office软件---Lotus Symphony在Linux系统下的应用
    Leetcode-967 Numbers With Same Consecutive Differences(连续差相同的数字)
    Leetcode-965 Univalued Binary Tree(单值二叉树)
    Leetcode-966 Vowel Spellchecker(元音拼写检查器)
  • 原文地址:https://www.cnblogs.com/cqkxzsxy/p/7410552.html
Copyright © 2020-2023  润新知