在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就大功告成了。
来源:https://www.cnblogs.com/qingshuimonk/p/android_ListView_1.html