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就大功告成了。