手记

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代码:

?

01

02

03

04

05

06

07

08

09

10

11

<?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代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<?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>

    考虑到每个列表项都可以是一个非常复杂的实体对象,用一个实体类更方便数据管理。创建一个类,代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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个主要方法,具体代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

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;

    }

}

</data></data>

    上面程序中最重要的就是getView()方法,其返回列表项组件。

    接下来为ListView提供Adapter,使用自定义的BaseAdapter决定ListView所要显示的列表项。新建CustomBaseAdapterActivity.java文件,加载上面新建的布局文件,具体代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

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;

    }

}

</data></data>

    可以发现使用自定义BaseAdapter创建ListView,界面交互代码非常简洁,却可以实现非常复杂的界面。

    运行程序,可以看到下图所示界面效果。

    至此,关于ListView中常用的几个Adapter基本学习完毕,如果还没有掌握建议回头再多练习。从下一期开始来优化我们的ListView,提供我们的Android程序运行效率。

    今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

原文链接:http://www.apkbus.com/blog-205190-68727.html

0人推荐
随时随地看视频
慕课网APP