ListView与ArrayAdapter的搭配使用

在android中,ListView是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过ArrayAdapter来使ListView显示和刷新内容。

假定现在有一String类型的ArrayList,叫myArrayList,建立ArrayAdapter并将其与myArrayList绑定的代码如下:


1

2

ArrayAdapter<String> myArrayAdapter =

     new ArrayAdapter<String>(this, android.layout.simple_list_item_1, myArrayList);

其中android.layout.simple_list_item_1是android本身的一个基本listview,在实际中也可以自建一个listview。

当有新的内容时,先将String添加到myArrayList,然后通过以下代码完成ListView的刷新显示:


1

2

myArrayList.add(0, myString);

myArrayAdapter.notifyDataSetChanged();

上面add方法的第一个参数是新String要添加的位置,从0开始一次递增。notifyDataSetChanged()的作用是告知ListView刷新内容。

在实际中,经常需要定制ListView,先要为所需的页面、边缘等需要的颜色在colors.xml文件中进行设置。并为页面宽度和页面边缘在dimens.xml中添加所需要的值。

然后需要扩展一个新的TextView类,用作ListView中每一行的显示,在init方法中创建获取前面创立的资源文件,并建立Paint对象,然后重写onDraw方法,利用Paint对象来重写图像。


1

2

3

4

5

6

7

8

9

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

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.widget.TextView;

    

public class WordItemView extends TextView{

        

    private Paint marginPaint;

    private Paint linePaint;

    private int paperColor;

    private float margin;

        

    //WordItemView的构造函数

    public WordItemView(Context context, AttributeSet ats, int ds){

        super(context, ats, ds);

        init();

    }

        

    public WordItemView(Context context){

        super(context);

        init();

    }

        

    public WordItemView(Context context, AttributeSet ats){

        super(context, ats);

        init();

    }

        

    private void init(){

        Resources myResources = getResources();

            

        //创建画刷

        marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        marginPaint.setColor(myResources.getColor(R.color.margin));

        linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        linePaint.setColor(myResources.getColor(R.color.lines));

            

        //获得页面背景色和边缘宽度

        paperColor = myResources.getColor(R.color.paper);

        margin = myResources.getDimension(R.dimen.margin);

    }

        

    @Override

    public void onDraw(Canvas canvas){

        //绘制页面颜色

        canvas.drawColor(paperColor);

            

        //绘制边缘

        //canvas.drawLine(0, 0, 0, getMeasuredHeight(), linePaint);

        canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);

        canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);

            

        //移动文本

        canvas.save();

        canvas.translate(margin, 0);

            

        //渲染文本

        super.onDraw(canvas);

        canvas.restore();

    }

        

}

接下来在res/layout中新建一个xml文件来指定每一个条目在视图列表中的排列方式。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?xml version="1.0" encoding="utf-8"?>

    <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

        

    <TextView

        android:id="@+id/itemMean"

        android:layout_height="match_parent"

        android:layout_width="wrap_content"

        android:layout_alignParentRight="true"

        android:textColor="@color/text"

        android:padding="10dp"

        android:scrollbars="vertical"

        android:fadingEdge="vertical"/>

    

    <com.qingshuimonk.words.WordItemView

        android:id="@+id/itemWord"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:padding="10dp"

        android:scrollbars="vertical"

        android:textColor="@color/text"

        android:textStyle="italic"

        android:fadingEdge="vertical"/>

    

</RelativeLayout>

重写ArrayAdapter方法使其适应现有的空间,在这个例子(一个能显示单词和释义的应用)里,有两个TextView需要显示。


1

2

3

4

5

6

7

8

9

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

import java.util.List;

    

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

    

public class MyAdapter extends ArrayAdapter<WordItem>{

        

    int resource;

        

    public MyAdapter(Context context, int _resource, List<WordItem> items){

        super(context, _resource, items);

        resource = _resource;

    }

        

    @Override

    public View getView(int position, View convertView, ViewGroup parent){

        LinearLayout newView;

            

        WordItem item = getItem(position);

            

        String word = item.getWord();

        String mean = item.getMean();

            

        if(convertView == null){

            newView = new LinearLayout(getContext());

            String inflater = Context.LAYOUT_INFLATER_SERVICE;

            LayoutInflater li;

            li = (LayoutInflater)getContext().getSystemService(inflater);

            li.inflate(resource, newView, true);

        }

        else{

            newView = (LinearLayout)convertView;

        }

            

        TextView wordView = (TextView)newView.findViewById(R.id.itemWord);

        TextView meanView = (TextView)newView.findViewById(R.id.itemMean);

            

        wordView.setText(word);

        meanView.setText(mean);

            

        return newView;

    }

        

}

最后在MainActivity里面对ArrayList和ArrayAdapter的绑定代码进行修改。


1

2

3

4

final ArrayList<WordItem> worditem = new ArrayList<WordItem>();

       final MyAdapter adapter =

               new MyAdapter(this, R.layout.worditem, worditem);

        wordsList.setAdapter(adapter);

这样定制的ListView就大功告成了。

时间: 2024-10-10 11:04:42

ListView与ArrayAdapter的搭配使用的相关文章

Android新手入门2016(8)--ListView之ArrayAdapter

本文来自肥宝传说之路,引用必须注明出处! ListView是Android中经常使用的控件. 什么是列表视图,让我们先看看图: 最常见的样例就是各种菜单的下啦列表. 要实现列表,须要完毕三个要素: 1.ListView 把全部的数据按指定的格式排成列表. 列表中每一项能够称为Item(如上图This is Title). 能够想象得出,要显示列表.就要先弄成相应的格式 2.adapter 适配器就是这样的ListView可以识别的格式,当然适配器有几种.以下再细说.适配器是指定格式的数据.可是我

Android -- ListView与ArrayAdapter、SimpleAdapter

对于ArrayAdapter,里面虽然能添加图片,但只能是相同的图片. 废话不多说: 布局&&list的item布局                                                                 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

Android train——ListView绑定ArrayAdapter、SimpleAdapter、SimpleCursorAdapter、BaseAdapter

ListView绑定ArrayAdapter res/layout/activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout

android笔记:ListView及ArrayAdapter

ListView用于展示大量数据,而数据无法直接传递给ListView,需要借助适配器adapter来完成. ArrayAdapter是最常用的adapter,可以通过泛型来指定要适配的数据类型. ArrayAdapter的参数如下: android.widget.ArrayAdapter.ArrayAdapter<String>(Context context, int textViewResourceId, String[] objects) 构造函数的参数解析如下: Context co

View(视图)——ListView之ArrayAdapter

1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent

andorid 列表视图 ListView 之ArrayAdapter

activity_ui3.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_p

安卓 listview与arrayadapter

今天有感于群里讨论的一个问题,很简单,但是问题还真是需要仔细看一下 问题:定义了一个最简单的arrayadapter,和listview结合使用,灭个item就显示个最简单的textView,一共6个item,一屏显示3个,遇到的问题就是,程序运行后,点击一屏显示出来的3个item没有问题,但是当滑动超出了一屏,再次点击item的时候就会出现nullpointer. 看了一下onitemlistener,是这么写的: list.setOnItemClickListener(new OnItemC

listview使用ArrayAdapter显示文字

package com.example.listview_6; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widge

深入理解使用ListView时ArrayAdapter、SimpleAdapter、BaseAdapter的原理

在使用ListView的时候,我们传给setAdapter方法的Adapter通常是ArrayAdapter.SimpleAdapter.BaseAdapter,但是这几个Adapter内部究竟是什么样子如果我们不搞清楚的话,在使用的时候就会感觉有些混乱,概括的说这三个Adapter之间的差异主要是由他们各自的getView方法的差异造成的,接下来我们一起看一下这几个Adapter的getView的源码 1.ArrayAdapter的getView方法源码如下: public View getV