ListView与ArrayAdapter的搭配使用

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

 

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

1 ArrayAdapter<String> myArrayAdapter = 
2     new ArrayAdapter<String>(this, android.layout.simple_list_item_1, myArrayList);

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

 

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

1 myArrayList.add(0, myString);
2 myArrayAdapter.notifyDataSetChanged();

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

 

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

 

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

 1 import android.content.Context;
 2 import android.content.res.Resources;
 3 import android.graphics.Canvas;
 4 import android.graphics.Paint;
 5 import android.util.AttributeSet;
 6 import android.widget.TextView;
 7 
 8 public class WordItemView extends TextView{
 9     
10     private Paint marginPaint;
11     private Paint linePaint;
12     private int paperColor;
13     private float margin;
14     
15     //WordItemView的构造函数
16     public WordItemView(Context context, AttributeSet ats, int ds){
17         super(context, ats, ds);
18         init();
19     }
20     
21     public WordItemView(Context context){
22         super(context);
23         init();
24     }
25     
26     public WordItemView(Context context, AttributeSet ats){
27         super(context, ats);
28         init();
29     }
30     
31     private void init(){
32         Resources myResources = getResources();
33         
34         //创建画刷
35         marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
36         marginPaint.setColor(myResources.getColor(R.color.margin));
37         linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
38         linePaint.setColor(myResources.getColor(R.color.lines));
39         
40         //获得页面背景色和边缘宽度
41         paperColor = myResources.getColor(R.color.paper);
42         margin = myResources.getDimension(R.dimen.margin);
43     }
44     
45     @Override
46     public void onDraw(Canvas canvas){
47         //绘制页面颜色
48         canvas.drawColor(paperColor);
49         
50         //绘制边缘
51         //canvas.drawLine(0, 0, 0, getMeasuredHeight(), linePaint);
52         canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
53         canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
54         
55         //移动文本
56         canvas.save();
57         canvas.translate(margin, 0);
58         
59         //渲染文本
60         super.onDraw(canvas);
61         canvas.restore();
62     }
63     
64 }

 

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

 1 <?xml version="1.0" encoding="utf-8"?>
 2     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5     
 6     <TextView
 7         android:id="@+id/itemMean"
 8         android:layout_height="match_parent"
 9         android:layout_width="wrap_content"
10         android:layout_alignParentRight="true"
11         android:textColor="@color/text"
12         android:padding="10dp"
13         android:scrollbars="vertical"
14         android:fadingEdge="vertical"/>
15 
16     <com.qingshuimonk.words.WordItemView 
17         android:id="@+id/itemWord"
18         android:layout_width="match_parent"
19         android:layout_height="match_parent"
20         android:padding="10dp"
21         android:scrollbars="vertical"
22         android:textColor="@color/text"
23         android:textStyle="italic"
24         android:fadingEdge="vertical"/>
25 
26 </RelativeLayout>

 

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

 1 import java.util.List;
 2 
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.ArrayAdapter;
 8 import android.widget.LinearLayout;
 9 import android.widget.RelativeLayout;
10 import android.widget.TextView;
11 
12 public class MyAdapter extends ArrayAdapter<WordItem>{
13     
14     int resource;
15     
16     public MyAdapter(Context context, int _resource, List<WordItem> items){
17         super(context, _resource, items);
18         resource = _resource;
19     }
20     
21     @Override
22     public View getView(int position, View convertView, ViewGroup parent){
23         LinearLayout newView;
24         
25         WordItem item = getItem(position);
26         
27         String word = item.getWord();
28         String mean = item.getMean();
29         
30         if(convertView == null){
31             newView = new LinearLayout(getContext());
32             String inflater = Context.LAYOUT_INFLATER_SERVICE;
33             LayoutInflater li;
34             li = (LayoutInflater)getContext().getSystemService(inflater);
35             li.inflate(resource, newView, true);
36         }
37         else{
38             newView = (LinearLayout)convertView;
39         }
40         
41         TextView wordView = (TextView)newView.findViewById(R.id.itemWord);
42         TextView meanView = (TextView)newView.findViewById(R.id.itemMean);
43         
44         wordView.setText(word);
45         meanView.setText(mean);
46         
47         return newView;
48     }
49     
50 }

 

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

1 final ArrayList<WordItem> worditem = new ArrayList<WordItem>();
2         final MyAdapter adapter = 
3                 new MyAdapter(this, R.layout.worditem, worditem);
4         wordsList.setAdapter(adapter);

 

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

 

 

  

posted on 2013-12-29 19:07  清水老和尚  阅读(1957)  评论(0编辑  收藏  举报

导航