編輯:關於Android編程
ListView作為一個列表展示的容器,裡面可以包含多個數據項,數據項可以是簡單的只有一個TextView的布局,也可以是復雜的組合布局。
繼承關系如下:
java.lang.Object android.view.View android.view.ViewGroup android.widget.AdapterView在API文檔中還有一句描述:android.widget.AbsListView android.widget.ListView
A view that shows items in a vertically scrolling list. The items come from the ListAdapter associated with this view.
一、最簡單的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中的解釋:
public SimpleAdapter(Contextcontext, List extends Map參數:>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
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()這個回調方法來直接獲取點擊事件的值。
一、圖片預覽:一、實現功能:需求要實現布局中為圓形圖片,圖片背景與圖標分開且合並到一個ImageView。二、具體實現:XML中布局中定義ImageView,關健設置兩個
在Android 系統移植做自己的移動設備,肯定會遇到更改開機或者關機畫面,配置自己產品logo 這點是必須的,這些都要
0. 前言Android的屏幕適配,即使得某一元素在Android不同尺寸、不同分辨率的手機上具備相同的顯示效果,這個問題一直以來都是我們Android開發者不得不面對的
Android中屏蔽電源鍵長按、Home鍵、Home鍵長按 這幾個“按鈕”的觸發,都會產生一個Action == Intent.ACTION_CLOSE_SYSTE