listview是一個重點內容,平時在開發的時候都只是初步了解,在網上粗略的看了一下就直接上手,還是在adapter中使用,了解的并不是很多,希望接下來的學習能使自己對ListView有一個更深刻的學習,達到熟悉使用。
簡單實現ListVIew 現在activity_main.xml文件中設置如下布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/ListView" android:layout_width="match_parent" android:layout_height="match_parent"> </ListVIew></LinearLayout>在代碼中添加如下代碼:
PRivate String[] data = {"Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Manog"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);//android.R.layout.simple_list_item_1是android內置的布局文件,里面只有一個TextView,用于簡單的顯示一段文本 ListView listView = (ListView)findViewById(R.id.list_view); listView.setadapter(arrayAdapter);}適配器用來設置內容,而listview是一個布局,要將內容顯示在布局上就需要布局調用setAdapter()方法將adapter傳進去。
實現一個圖片對應文字的效果: 先定義一個實體類:
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; }}在layout目錄下新建fruit_item.xml:
<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="centent" android:layout_marginLeft="10d接下來創建自定義的適配器,繼承ArrayAdapter,指定Fruit類,新建FruitAdapter:public class FruitAdapter extent ArrayAdapter<Fruit>{ private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> Objects) super(context, textViewResourceId, objects); reourceId = textViewResourceId;}@Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); 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; }FruitAdapter 重寫了父類的一組構造函數,用于將上下文、ListView 子項布局的 id 和數 據都傳遞進來。另外又重寫了 getView()方法,這個方法在每個子項被滾動到屏幕內的時候 會被調用。在 getView 方法中,首先通過 getItem()方法得到當前項的 Fruit 實例,然后使用 LayoutInflater 來為這個子項加載我們傳入的布局, 接著調用 View 的 findViewById()方法分別 獲取到 ImageView 和 TextView 的實例,并分別調用它們的 setImageResource()和 setText()方 法來設置顯示的圖片和文字,最后將布局返回,這樣我們自定義的適配器就完成了 修改 MainActivity 中的代碼:
private List<Fruit> fruitList = new ArrayList<Fruit>();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);} private void initFruits() { Fruit apple = new Fruit("Apple", R.drawable.apple_pic); fruitList.add(apple); Fruit banana = new Fruit("Banana", R.drawable.banana_pic); fruitList.add(banana); Fruit orange = new Fruit("Orange", R.drawable.orange_pic); fruitList.add(orange); Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic); fruitList.add(watermelon); Fruit pear = new Fruit("Pear", R.drawable.pear_pic); fruitList.add(pear); Fruit grape = new Fruit("Grape", R.drawable.grape_pic); fruitList.add(grape); Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic); fruitList.add(pineapple); Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic); fruitList.add(strawberry); Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic); fruitList.add(cherry); Fruit mango = new Fruit("Mango", R.drawable.mango_pic); fruitList.add(mango);}對listView進行功能的優化: convertView是用于將之前加載好的布局進行緩存,以便以后重用,所以代碼可以修改為以下形式:
View view;ViewHolder viewHolder;if(convertView == null){ view = LayoutInflate.from(getContext()).inflate(resourceId, null); viewHolder = new viewHolder(); viewHolder.fruitImage = (ImageView)view.findViewById(R.id.fruit_view); viewHolder.fruitName = (TextView)view.findViewById(R.id.fruit_name); view.setTag(viewHolder);//將viewHolder存儲在View中}else{ view = convertView; viewHolder = (ViewHolder)view.getTag();//重新獲取ViewHolder}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());class ViewHolder{ ImageView fruitImage; TextView fruitName;}新聞熱點
疑難解答