ListView的使用詳解

    剛完成了一個課程設計,手機客戶端加服務端,在寫android程序的時候,基本上不清楚的都是google的,還有些難題是直接跑國外論壇,一個課程設計下來,收穫確實蠻多的,但是過後再去看一些知識點的時候,才發現開發中遇到的一些問題其實都是一些基本的問題,以前也都學到過,但是沒用就忘了,很多實現其實有很簡單的方法,有最合適的官方包裝,但是由於不熟悉,導致代碼冗餘度太大,主要是浪費了很多時間,出力不討好啊,所以就打算總結一下,什麼時候用的時候,知道是什麼知識,該用什麼方法去實現。


listview佈局文件中常用的屬性


ListView的實現可以在xml文件中添加<ListView>組件,也可以直接繼承ListView類,要顯示內容,在xml佈局文件中可以直接android:entries="@array/books"引用一個數組資源顯示其內容,當然大部分顯示都是用adapter。

在listview中常用的四個adapter類:ArrayAdapter,SImpleAdapter,SImpleCursorAdapter,BaseAdapter,其中前三個都是BaseAdapter的子類,對BaseAdapter做了特定的擴展,用BaseAdapter可以做到自定義的擴展。

String[] strs = {"小紅帽", "大灰狼", "新概念"};
        
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        		android.R.layout.simple_list_item_1, strs);
ArrayAdapter的第二個參數是一個資源ID,該資源代表一個TextView,這裏用的是系統自帶的佈局,也可以使用自定義的textview的xml。當然也可以指定某一佈局中的一個TextView組件,如下代碼:

listView.setAdapter(new ArrayAdapter<String>(  
                MainActivity.this,  
                R.layout.show,  
                R.id.textView,  
                data));  

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,  
            int resource, String[] from, int[] to)  
SimpleAdapter的構造方法只此一個,小例子如下:

ListView lv = (ListView) findViewById(R.id.listView1);
        String[] from = { "Text", "Button" };
        int[] to = { R.id.text, R.id.button };
        List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
        for (int i = 0; i < 10; i++) {
            Map<String, String> m = new HashMap<String, String>();
            m.put("Text", "Text" + i);
            m.put("Button", "Button" + i);
            list.add(m);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem, from, to);
        lv.setAdapter(adapter);
SimpleCursorAdapter主要是用於顯示cursor裏面的內容,小例子如下:

 setContentView(R.layout.main);
        Cursor cursor = getContentResolver().query(Location.CONTENT_URI, mLocationProjection,
                null, null, null);
        //from跟to,非常有趣,把什麼值顯示在什麼控件上。,是一個數組,支持多個綁定
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                R.layout.provice_list_item, cursor,
                new String[] {Location.PROVICE, Location.CITY },
                new int[] { R.id.princeTextView,android.R.id.text1 });
        //給listview設置cursor有很多種方式,這是最簡單的方式
        setListAdapter(adapter);

BaseAdapter標準模板:

class ListOrdersAdapter extends BaseAdapter {
		private LayoutInflater inflater;
		private List<OrderBean> orderList;
		public ListOrdersAdapter(Context context, List<OrderBean> orderList) {
			inflater = LayoutInflater.from(context);
			this.orderList = orderList;
		}
		
		@Override 
		public int getCount() {
			System.out.println("getCount----------"+orderList.size());
			return orderList.size();
		}

		@Override
		public Object getItem(int position) {
			return orderList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			System.out.println("++++++++++++++++++++"+position);
			
			ViewHolder viewHolder;
			if(convertView == null){
				convertView = inflater.inflate(R.layout.ordershow, null);
				viewHolder = new ViewHolder();
				viewHolder.orderId = (TextView)convertView.findViewById(R.id.show_order_id);
				viewHolder.orderCus = (TextView)convertView.findViewById(R.id.show_order_cus);
				viewHolder.orderDate = (TextView)convertView.findViewById(R.id.show_order_date);
				
				convertView.setTag(viewHolder);
			}else {
				viewHolder = (ViewHolder)convertView.getTag();
			}
			
			String strOrderId = orderList.get(position).getOrderNum();
			String strOrderCus = orderList.get(position).getOrderCusName();
			String strOrderDate = orderList.get(position).getOrderDate();
			
			System.out.println(strOrderId+" "+strOrderCus+" "+strOrderDate);
			
			viewHolder.orderId.setText(strOrderId);
			viewHolder.orderCus.setText(strOrderCus);
			viewHolder.orderDate.setText(strOrderDate);
			
			return convertView;
		}
	}
	
	static class ViewHolder {
		TextView orderId;
		TextView orderCus;
		TextView orderDate;
		
	}

下一篇文章將詳細解釋,在BaseAdapter中爲什麼要用ViewHolder





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章