Android入门之ListView应用解析(二)

时间:2022-03-28 06:49:42

上一篇关于AndroidListView的介绍讲的是如何制作一个具有两行文本的自定义控件,作为ListView的Item的使用方法。本文接下来也是围绕ListView和Item,更加深入地介绍它们的用法。

首先,先来看看本文代码运行的结果,本文的Item比上一篇中的Item多出左边的图标:

Android入门之ListView应用解析(二)

main.xml的源代码,跟上一篇的一样,这里就不作解释了,直接贴出item.xml的代码,就是它实现ImageItem的UI:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
     android:layout_width="fill_parent"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
     android:paddingBottom="4dip"
     android:paddingLeft="12dip">
     <ImageView
        android:layout_width="wrap_content"
        android:id="@+id/itemImage" android:layout_height="fill_parent"
     </ImageView>
     <TextView
        android:text="TextView01"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:id="@+id/itemTitle" android:layout_toRightOf="@+id/itemImage" android:textSize="20dip">
     </TextView>
     <TextView
        android:text="TextView02"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:id="@+id/itemText" android:layout_toRightOf="@+id/itemImage" android:layout_below="@+id/itemTitle">
     </TextView>
</RelativeLayout>

解释一下 item.xml的代码:这里使用了RelativeLayout布局,控件的关键的属性是:

itemTitle的属性 android:layout_toRightOf="@+id/itemImage" ,itemTitle在itemImage的右边;

itemText的属性 android:layout_toRightOf="@+id/itemImage",ItemText在itemImage的右边, android:layout_below="@+id/itemTitle", itemText 在 itemTitle的下面。

最后,贴出JAVA的源代码,代码中的重点是LayoutInflate的用法。LayoutInflate的使用方法如下:

LayoutInflater的作用是,把一个View的对象与XML布局文件关联并实例化。
View的对象实例化之后,可以通过findViewById()查找布局文件中的指定Id的组件。

Java代码如下:

  1. package com.testListView; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.os.Bundle; 
  6. import android.view.LayoutInflater; 
  7. import android.view.View; 
  8. import android.view.ViewGroup; 
  9. import android.widget.BaseAdapter; 
  10. import android.widget.ImageView; 
  11. import android.widget.ListView; 
  12. import android.widget.TextView; 
  13.  
  14. public class testListView extends Activity { 
  15.  ListView listView; 
  16.  String[] titles={"标题1","标题2","标题3","标题4"}; 
  17.  String[] texts={"文本内容A","文本内容B","文本内容C","文本内容D"}; 
  18.  int[] resIds={R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon}; 
  19.   
  20.  @Override 
  21.  public void onCreate(Bundle savedInstanceState) { 
  22.  super.onCreate(savedInstanceState); 
  23.  setContentView(R.layout.main); 
  24.  this.setTitle("BaseAdapter for ListView"); 
  25.  listView=(ListView)this.findViewById(R.id.listView1); 
  26.  listView.setAdapter(new ListViewAdapter(titles,texts,resIds)); 
  27.  } 
  28.  
  29.  public class ListViewAdapter extends BaseAdapter { 
  30.  View[] itemViews; 
  31.  
  32.  public ListViewAdapter(String[] itemTitles, String[] itemTexts, 
  33.   int[] itemImageRes) { 
  34.   itemViews = new View[itemTitles.length]; 
  35.  
  36.   for (int i = 0; i < itemViews.length; i++) { 
  37.   itemViews[i] = makeItemView(itemTitles[i], itemTexts[i], 
  38.    itemImageRes[i]); 
  39.   } 
  40.  } 
  41.  
  42.  public int getCount() { 
  43.   return itemViews.length; 
  44.  } 
  45.  
  46.  public View getItem(int position) { 
  47.   return itemViews[position]; 
  48.  } 
  49.  
  50.  public long getItemId(int position) { 
  51.   return position; 
  52.  } 
  53.  
  54.  private View makeItemView(String strTitle, String strText, int resId) { 
  55.   LayoutInflater inflater = (LayoutInflater) testListView.this 
  56.    .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  57.  
  58.   // 使用View的对象itemView与R.layout.item关联 
  59.   View itemView = inflater.inflate(R.layout.item, null); 
  60.  
  61.   // 通过findViewById()方法实例R.layout.item内各组件 
  62.   TextView title = (TextView) itemView.findViewById(R.id.itemTitle); 
  63.   title.setText(strTitle); 
  64.   TextView text = (TextView) itemView.findViewById(R.id.itemText); 
  65.   text.setText(strText); 
  66.   ImageView image = (ImageView) itemView.findViewById(R.id.itemImage); 
  67.   image.setImageResource(resId); 
  68.    
  69.   return itemView; 
  70.  } 
  71.  
  72.  public View getView(int position, View convertView, ViewGroup parent) { 
  73.   if (convertView == null
  74.   return itemViews[position]; 
  75.   return convertView; 
  76.  } 
  77.  } 
  78.