Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Container之ListView 1

Container之ListView 1

編輯:關於Android編程

ListView作為一個列表展示的容器,裡面可以包含多個數據項,數據項可以是簡單的只有一個TextView的布局,也可以是復雜的組合布局。

繼承關系如下:

類 ListView

java.lang.Object
  繼承者 android.view.View
      繼承者 android.view.ViewGroup
          繼承者 android.widget.AdapterView
              繼承者 android.widget.AbsListView
                  繼承者 android.widget.ListView
在API文檔中還有一句描述:

A view that shows items in a vertically scrolling list. The items come from the ListAdapter associated with this view. 

ListView是一種列表可以在垂直方向滾動的視圖,數據項來自於和這個視圖綁定的ListAdapter。那麼有一種特殊的情況下ListView或許不可用,那就是在ScrollView下。筆者無意間發現的,筆者為了偷懶把關於Widgets所有的實驗都放到了一個項目中在頂層用了一個ScrollView,在這種情況下添加ListView只能顯示第一條數據。

一、最簡單的ListView

使用方法類似於Spinner,需要一個數據源最簡單的是數組,一個Adapter,然後將ListView和這個Adapter通過ListView的setAdapter()方法綁定,這樣一個最簡單的ListView就成功了。

                ListView lv_01 = (ListView)findViewById(R.id.lv_listview01);
		String []itmes = new String[]{"逍遙","靈兒","月如"};
		ArrayAdapter aadapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1
				,itmes);
		lv_01.setAdapter(aadapter);
運行結果:

\

二、自定義的ListView<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z8i/tNK7z8JBUEnW0Expc3RWaWV3tcRzZXRBZGFwdGVyKCm1xLe9t6i94srNo7o8L3A+CjxwcmUgY2xhc3M9"brush:java;">public void setAdapter(ListAdapteradapter)

Sets the data behind this ListView. The adapter passed to this method may be wrapped by a WrapperListAdapter, depending on the ListView features currently in use. For instance, adding headers and/or footers will cause the adapter to be wrapped. 
這個方法為ListView設置數據,這個適配器通過這個方法傳遞數據,這個數據可能會被一個組裝適配器組裝,樣式取決於當前使用的ListView特點,比如添加頁面或者頁腳。


通過這個解釋我們可以發現ListView的樣式是通過Adapter設置的,下面繼續看adapter的定義:

Extended Adapter that is the bridge between a ListView and the data that backs the list. Frequently that data comes from a Cursor, but that is not required. The ListView can display any data provided that it is wrapped in a ListAdapter.

擴展的adapter是數據和視圖的橋梁,通常數據來自一個游標但是通常不需要,listview可以呈現任何提供給它的數據,這數據是通過listAdapter組裝的。

到這裡我們了解到:數據源 + Adapter + 布局 就可以了得到一個我們自定義的ListView了。

數據源:數組 或者 List

Adapter:SimpleAdapter 拓展性比較好,可以放各種其他控件進行組合。

布局:layout.xml

關於SimpleAdapter的參數相信很多初學者和筆者一樣搞的是一塌糊塗,因為參數太多了,而且還很難記憶,先來看一下官方API中的解釋:

SimpleAdapter

public SimpleAdapter(Contextcontext,
                     List>data,
                     intresource,
                     String[]from,
                     int[]to)
參數:context - The context where the View associated with this SimpleAdapter is runningdata - A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"resource - Resource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"from - A list of column names that will be added to the Map associated with each item.to - The views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter1.context好理解,當前上下文。

2.data,首先它是一個裝有某種Map的List集合(一個List裡面的內容必須是某種Map),後面的有點繞,這個List中的每一項(應該是下面from這個參數的)要和List的一行相同(無語),這個Map中每一行包含的數據,應該包含"from"中的每一項。光看文字估計會看的瘋掉,還是看一下例子代碼就清楚了:

SimpleAdapter sa = new SimpleAdapter(this, getData(), R.layout.item_listview, 
				new String[]{"icon","content","content1"}, new int[]{R.id.iv_icon,R.id.tv_content,R.id.tv_content1});

private List> getData(){
		List> myList = new ArrayList>();
		Map map = new HashMap();
		
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "xiaoyao");
		map.put("content1", "男主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "linger");
		map.put("content1", "女主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "月如");
		map.put("content1", "女主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "tangyu");
		map.put("content1", "男主角");
		myList.add(map);
		
		return myList;
	}

對比發現:應該說的是from中的參數應該是map的key。筆者是這樣理解的,如果不對的話,歡迎指出。

3.這個參數定義了一個layout來描述這個view中每一項的樣式,並且這個layout至少應該包含to中的參數所定義的views(指的是ID)

4.這個視圖應該展現出在from的參數中的列所對應的值,他們必須都是TextView而且顯示順序是根據to中列的順序來定的。

大體的意思是參數3中(描述每一個item樣式的layout)出現的id至少要包括4中所列出來的,並且在實際的呈現順序就是按照這個列的順序。

比較完整的代碼如下:MainActivity,由於繼承了ListActivity,便不用在xml中定義ListView了。

public class MainActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		SimpleAdapter sa = new SimpleAdapter(this, getData(), R.layout.item_listview, 
				new String[]{"icon","content","content1"}, new int[]{R.id.iv_icon,R.id.tv_content,R.id.tv_content1});	
		this.setListAdapter(sa);
		
		
	}	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		Log.i("abc",getData().get(position).toString());
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	private List> getData(){
		List> myList = new ArrayList>();
		Map map = new HashMap();
		
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "xiaoyao");
		map.put("content1", "男主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "linger");
		map.put("content1", "女主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "月如");
		map.put("content1", "女主角");
		myList.add(map);
		map = new HashMap();
		map.put("icon",R.drawable.ic_launcher);
		map.put("content", "tangyu");
		map.put("content1", "男主角");
		myList.add(map);
		
		return myList;
	}
}



item_listview.xml



    
    
    
    
   
    
    


運行結果:

\


由於這裡直接繼承了ListActivity因此可以直接通過重寫onListItemClick()這個回調方法來直接獲取點擊事件的值。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved