自定義listview的步驟


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()方法來獲取控件實例了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM