1、定義一個實體類;
public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; } }
2、新建item.xml,放入控件,這里是listview中每個item的內容;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip" /> </LinearLayout>
3、自定義adapter,新建自定義的adapter繼承arrayadapter,泛型指定為之前的實體類。構造函數包括上下文、listview的子項布局,還有數據。然后重寫getView方法,先通過getitem獲取當前實例,然后用LayoutInflater加載布局,調用view的findviewbyid方法與控件聯系起來,然后用settext等方法設置內容,返回view
public class FruitAdapter extends ArrayAdapter<Fruit> { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); // 獲取當前項的Fruit實例 View view = LayoutInflater.from(getContext()).inflate(resourceId, null); ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName()); return view; } }
4、在所在的activity中定義一個類型為實體類的List,將對象添加到list中,定義一個adapter對象,構造參數分別是當前活動,子項布局和list對象;定義listview,調用setadapter方法;
public class MainActivity extends Activity { private List<Fruit> fruitList = new ArrayList<Fruit>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initFruits(); // 初始化水果數據 FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); }
只要修改item.xml的內容,界面就可以更加復雜。
5、提升運行效率
getview方法中有一個convertview,用來緩存之前加載好的內容,所以可以加一個條件判斷如果 convertView 為空,則使用LayoutInflater 去加載布局,如果不為空則直接對 convertView 進行重用。
View view; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, null); } else { view = convertView; }
還可以用內部類viewholder,對控件實例進行緩存,當convertView 為空的時候,創建一個 ViewHolder 對象,並將控件的實例都存放在 ViewHolder 里,然后調用 View的 setTag()方法,將 ViewHolder 對象存儲在 View 中。當 convertView 不為空的時候則調用View 的 getTag()方法,把 ViewHolder 重新取出。這樣所有控件的實例都緩存在了 ViewHolder里,就沒有必要每次都通過 findViewById()方法來獲取控件實例了。