androidlistview橫向
❶ Android listview 的用法 越詳細越好。
Android listview與adapter用法
listview與adapter用法
一個ListView通常有兩個職責。
(1)將數據填充到布局。
(2)處理用戶的選擇點擊等操作。
第一點很好理解,ListView就是實現這個功能的。第二點也不難做到,在後面的學習中讀者會發現,這非常簡單。
一個ListView的創建需要3個元素。
(1)ListView中的每一列的View。
(2)填入View的數據或者圖片等。
(3)連接數據與ListView的適配器。
也就是說,要使用ListView,首先要了解什麼是適配器。適配器是一個連接數據和AdapterView(ListView就是一個典型的AdapterView,後面還會學習其他的)的橋梁,通過它能有效地實現數據與AdapterView的分離設置,使AdapterView與數據的綁定更加簡便,修改更加方便
Android中提供了很多的Adapter,表4-5列出了常用的幾個。
表4-5 常用適配器
Adapter
含義
ArrayAdapter<T>
用來綁定一個數組,支持泛型操作
SimpleAdapter
用來綁定在xml中定義的控制項對應的數據
SimpleCursorAdapter
用來綁定游標得到的數據
BaseAdapter
通用的基礎適配器
其實適配器還有很多,要注意的是,各種Adapter只不過是轉換的方式和能力不一樣而已。下面就通過使用不同的Adapter來為ListView綁定數據(SimpleCursorAdapter暫且不講,後面講SQLite時會介紹)。
4.12.1 ListView使用ArrayAdapter
用ArrayAdapter可以實現簡單的ListView的數據綁定。默認情況下,ArrayAdapter綁定每個對象的toString值到layout中預先定義的TextView控制項上。ArrayAdapter的使用非常簡單。
實例:
工程目錄:EX_04_12
在布局文件中加入一個ListView控制項。
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="
http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent"> <!-- 添加一個ListView控制項 --> <ListView
android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>
然後在Activity中初始化。
publicclass MyListView extends Activity {
privatestaticfinal String[] strs = new String[] {
"first", "second", "third", "fourth", "fifth"
};//定義一個String數組用來顯示ListView的內容private ListView lv;/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) findViewById(R.id.lv);//得到ListView對象的引用 /*為ListView設置Adapter來綁定數據*/
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, strs));
}
}
▲圖4-29 ListView使用ArrayAdapter運行效果
代碼非常的簡單,運行效果如圖4-29所示。
分析一下使用的步驟。
(1)定義一個數組來存放ListView中item的內容。
(2)通過實現ArrayAdapter的構造函數來創建一個ArrayAdapter的對象。
(3)通過ListView的setAdapter()方法綁定ArrayAdapter。
其中第二步有必要說一下的是,ArrayAdapter有多個構造函數,例子中實現的是最常用的一種。第一個參數為上下文,第二個參數為一個包含TextView,用來填充ListView的每一行的布局資源ID。第三個參數為ListView的內容。其中第二個參數可以自定義一個layout,但是這個layout必須要有TextView控制項。通常我們使用Android提供的資源,除了例子中所用的,常用的還有如下幾種,可實現帶RadioButton和CheckBox的ListView。
(1)通過指定android.R.layout.simple_list_item_checked這個資源,實現帶選擇框的ListView。需要用setChoiceMode()方法設定選擇為多選還是單選,否則將不能實現選擇效果,運行效果如圖4-30所示。
實現代碼如下:
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, strs));
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
(2)通過指定android.R.layout.simple_list_item_multiple_choice這個資源實現帶CheckBox的ListView。同樣的,需要用setChoiceMode()方法來設置單選或者多選,運行效果如圖4-31所示。
實現代碼如下:
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, strs));
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
(3)通過指定android.R.layout.simple_list_item_single_choice這個資源實現帶RadioButton的ListView。這里要注意的是,這里並不是指定了單選。是多選還是單選要通過setChoiceMode()方法來指定,運行效果如圖4-32所示。
實現代碼如下:
lv.setAdapter(newArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice,strs));
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
在前面講到過,ListView的職責除了填充數據外,還要處理用戶的操作。通過如下的代碼就可以為ListView綁定一個點擊監聽器,點擊後在標題欄顯示點擊的行數。
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//點擊後在標題上顯示點擊了第幾行 setTitle("你點擊了第"+arg2+"行");
}
});
4.12.2 ListView使用SimpleAdapter
很多時候需要在列表中展示一些除了文字以外的東西,比如圖片等。這時候可以使用SimpleAdapter。SimpleAdapter的使用也非常簡單,同時它的功能也非常強大。可以通過它自定義ListView中的item的內容,比如圖片、多選框等。看一個例子,實現一個每一行都有一個ImageView和TextView的ListView。先看一下運行效果,如圖4-34所示。
▲圖4-34 帶圖標的ListView
首先在布局文件中增加一個ListView控制項。
還需要定義一個ListView中每一行的布局,用RelativeLayout來實現一個帶兩行字和一個圖片的布局。
item.xml:
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent" android:layout_width="fill_parent">
<ImageViewandroid:layout_alignParentRight="true" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/ItemImage"/>
<TextViewandroid:id="@+id/ItemTitle" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:textSize="20sp"/>
<TextViewandroid:id="@+id/ItemText" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_below="@+id/ItemTitle"/> </RelativeLayout>
配置完畢,就可以在Java代碼中為ListView綁定數據。
publicclass MyListViewSimple extends Activity {
private ListView lv;
/** Called when the activity is first created. */ @Override
publicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) findViewById(R.id.lv);/*定義一個動態數組*/
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();/*在數組中存放數據*/
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.icon);//加入圖片 map.put("ItemTitle", "第"+i+"行");
map.put("ItemText", "這是第"+i+"行");
listItem.add(map);
}
SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,//需要綁定的數據
R.layout.item,//每一行的布局//動態數組中的數據源的鍵對應到定義布局的View中new String[] {"ItemImage"
,"ItemTitle", "ItemText"},
newint[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
);
lv.setAdapter(mSimpleAdapter);//為ListView綁定適配器 lv.setOnItemClickListener(new
OnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
setTitle("你點擊了第"+arg2+"行");//設置標題欄顯示點擊的行
}
});
}
}
使用simpleAdapter的數據一般都是用HashMap構成的列表,列表的每一節對應ListView的每一行。通過SimpleAdapter的構造函數,將HashMap的每個鍵的數據映射到布局文件中對應控制項上。這個布局文件一般根據自己的需要來自己定義。梳理一下使用SimpleAdapter的步驟。
(1)根據需要定義ListView每行所實現的布局。
(2)定義一個HashMap構成的列表,將數據以鍵值對的方式存放在裡面。
(3)構造SimpleAdapter對象。
(4)將LsitView綁定到SimpleAdapter上。
4.12.3 ListView使用BaseAdapter與ListView的優化
在ListView的使用中,有時候還需要在裡面加入按鈕等控制項,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是裡面的控制項要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。
使用simpleAdapter的數據一般都是用HashMap構成的列表,列表的每一節對應ListView的每一行。通過SimpleAdapter的構造函數,將HashMap的每個鍵的數據映射到布局文件中對應控制項上。這個布局文件一般根據自己的需要來自己定義。梳理一下使用SimpleAdapter的步驟。
(1)根據需要定義ListView每行所實現的布局。
(2)定義一個HashMap構成的列表,將數據以鍵值對的方式存放在裡面。
(3)構造SimpleAdapter對象。
(4)將LsitView綁定到SimpleAdapter上。
4.12.3 ListView使用BaseAdapter與ListView的優化
在ListView的使用中,有時候還需要在裡面加入按鈕等控制項,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是裡面的控制項要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。
【內容較多,可以自己去看】
[轉自:http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html]
❷ android 怎麼給listview添加一個固定表頭以及顯示像table的效果
定義一個樣式一條線
<style name="vertical_layout">
<item name="android:layout_width">1dp</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:background">#dadada</item>
</style>
1.為表頭新建一個layout:a_item.xml(一共設置3個列名)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/a_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:cacheColorHint="#00000000"
android:orientation="horizontal" >
<TextView
android:id="@+id/item1bzrbjzb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:ellipsize="none"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:singleLine="false"
android:textSize="15.0sp" >
</TextView>
<View style="@style/vertical_layout" /> <!-- 一條線 -->
<TextView
android:id="@+id/item2bzrbjzb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:ellipsize="none"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:singleLine="false"
android:text="@string/bzr_km" <!-- 列名-->
android:textColor="@android:color/black"
android:textSize="15.0sp" >
</TextView>
<View style="@style/vertical_layout" /> <!-- 一條線 -->
<TextView
android:id="@+id/item3bzrbjzb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:ellipsize="none"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:singleLine="false"
android:text="@string/bzr_bjqk" <!-- 列名-->
android:textColor="@android:color/black"
android:textSize="15.0sp" >
</TextView>
<View style="@style/vertical_layout" /> <!-- 一條線 -->
<TextView
android:id="@+id/item4bzrbjzb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:ellipsize="none"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:singleLine="false"
android:text="@string/bzr_jfjgl" <!-- 列名-->
android:textColor="@android:color/black"
android:textSize="15.0sp" >
</TextView>
<TextView
android:id="@+id/item6ctj"
android:layout_width="100.0dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:ellipsize="none"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:singleLine="false" >
</TextView>
</LinearLayout>
第一個和最後一個textView不給賦值,用於填充屏幕的空白,顯示好看
2.給界面**Activity新建一個main_layout,應用剛才的a_item.xml以及添加一個繼承了listView的view對象HVListView
***
<include layout="@layout/a_item" />
<com.gdtech.znpc.android.view.HVListView
android:id="@android:id/list"
android:background="@android:color/white" android:fastScrollEnabled="true"
android:fadingEdgeLength="0.0sp" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:drawSelectorOnTop="false"
android:divider="#dadada"
android:dividerHeight="1.0dip"
android:cacheColorHint="#00000000">
</com.gdtech.znpc.android.view.HVListView >
******
3.獲取屏幕的解析度 為每個表頭的設置寬度
private DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
private int w = dm.widthPixels / 16; // 當前解析度 寬度 分為16份
獲取a_item裡面的每個textView的id 進行寬度設置
mListView = (HVListView) findViewById(android.R.id.list);
// 設置列頭
mListView.mListHead = (LinearLayout) findViewById(R.id.a_item);
// 設置表頭的寬度
TextView t11 = (TextView) findViewById(R.id.item1bzrbjzb);
TextView t12 = (TextView) findViewById(R.id.item2bzrbjzb);
TextView t13 = (TextView) findViewById(R.id.item3bzrbjzb);
TextView t14 = (TextView) findViewById(R.id.item4bzrbjzb);
//t13.setText("成績");
t11.setWidth(w * 0); //不顯示第一列
t12.setWidth(w * 3);
t13.setWidth(w * 6);
t14.setWidth(w * 6);
4.給HVListView添加適配器,並設置每列的寬度和表頭對應
class ViewHolderbjzb { // 這個類裡面定義的TextView數量和表頭裡面的TextView要一致
TextView item1bjzb;
TextView item2bjzb;
TextView item3bjzb;
TextView item4bjzb;
}
mAdapter = new DataAdapter1();
mListView.setAdapter(mAdapter);
private class DataAdapter1 extends BaseAdapter {
@Override
public int getCount() {
return hang;// 固定顯示多少行數據
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater1.inflate(R.layout.bzr_fx_bjzb_head_item,
null);
holder = new ViewHolderbjzb();
holder.item1bjzb = ((TextView) convertView
.findViewById(R.id.item1bzrbjzb));
holder.item2bjzb = ((TextView) convertView
.findViewById(R.id.item2bzrbjzb));
holder.item3bjzb = ((TextView) convertView
.findViewById(R.id.item3bzrbjzb));
holder.item4bjzb = ((TextView)convertView
.findViewById(R.id.item4bzrbjzb));
// holder.item4bjzb=((TextView)
// convertView.findViewById(R.id.item4bjzb));
// holder.item5bjzb=((TextView)
// convertView.findViewById(R.id.item5bjzb));
convertView.setTag(holder);
// 設置表格內容寬度,與表頭對應
holder.item1bjzb.setWidth(w * 0);
holder.item2bjzb.setWidth(w * 3);
holder.item3bjzb.setWidth(w * 6);
holder.item4bjzb.setWidth(w * 6);
holder.item1bjzb.setText("");
holder.item2bjzb.setText("");
holder.item3bjzb.setText("");
holder.item4bjzb.setText("");
// holder.item4bjzb.setText("");
// holder.item5bjzb.setText("");
} else {
holder = (ViewHolderbjzb) convertView.getTag();
}
for (int i = 0; i < listDatas.size(); i++) {
// 顯示列的id數
// holder.item1bjzb.setText((position + 1) + "");
/*
listDatas 就是要顯示的後台數據
*/
if (position == i) {
Map<String, Object> row = listDatas.get(position);
holder.item1bjzb.setText("用後台獲取的數據 進行填充就可以"));
holder.item2bjzb.setText("用後台獲取的數據 進行填充就可以"));
holder.item3bjzb.setText("用後台獲取的數據 進行填充就可以"));
holder.item4bjzb.setText("用後台獲取的數據 進行填充就可以"));
}
}
// 設置隔行顏色
if (position % 2 != 0) {
convertView.setBackgroundResource(R.drawable.listview_color_1);
} else {
convertView.setBackgroundResource(R.drawable.listview_color_2);
}
return convertView;
}
網上有很多解決 android listview 水平和垂直滾動的代碼,我沒有按照他們說的做(以前沒搜到 O(∩_∩)O~) 我採用的是添加HorizontalScrollView
Java代碼
1. < ScrollView android:id="@+id/ScrollView01"
2. android:layout_height="300px"
3. android:layout_x="16px"
4. android:layout_y="84px"
5. android:layout_width="290px"
6. android:scrollbars="horizontal|vertical">
7. < HorizontalScrollView android:id="@+id/HorizontalScrollView01"
8. android:layout_height="fill_parent"
9. android:layout_width="wrap_content">
10. < LinearLayout android:id="@+id/LinearLayout02"
11. android:layout_width="wrap_content"
12. android:orientation="vertical"
13. android:layout_height="fill_parent">
14. < ListView android:id="@+id/listview"
15. android:layout_height="300px"
16. android:layout_width="fill_parent">
17. < /ListView>
18. < /LinearLayout>
19. < /HorizontalScrollView>
20. < /ScrollView>
我有一個Listview,因為橫屏和豎屏原因,內容較多,豎屏會出現有些數據無法顯示
於是讓Listview在橫向上可以滾動。
解決的辦法是,用HorizontalScrollView包裝Listview,這樣,當豎屏時,就會出現橫向滾動條。
<HorizontalScrollView
Android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<ListView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@drawable/email_box"
android:id="@+id/advice_main_list_id"
android:padding="5dip"/>
</HorizontalScrollView>
但此時又出現了另一個問題,加上HorizontalScrollView後,雖然我已經設了Listview的寬度是fill_parent。但當內容較少時,Listview還是根據內容自適應寬度,不能滿屏。
此時,需要設置一個屬性就能解決問題了。設置HorizontalScrollView的android:fillViewport="true"。也就是設置是否將HorizontalScrollView的內容寬度拉伸以適應視口(viewport)
❸ android ListView用法和屬性
ListView是一個用來縱向顯示條目的視圖,這些條目內容來自於與該ListView相關聯的ListAdapter.
android:divider//在列表條目之間顯示的drawable或color
android:dividerHeight//用來指定divider的高度
android:entries//構成ListView的數組資源的引用。對於某些固定的資源,這個屬性提供了比在程序中添加資源更加簡便的方式
android:footerDividersEnabled//當設為false時,ListView將不會在各個footer之間繪制divider.默認為true。
android:headerDividersEnabled//當設為false時,ListView將不會在各個header之間繪制divider.默認為true
android:cacheColorHint// 表明這個列表的背景始終以單一、固定的顏色繪制,可以優化繪制過程。
android:choiceMode//為視圖指定選擇的行為。可選的類型有:none、singleChoice、multipleChoice、multipleChoiceModal。
android:drawSelectorOnTop// 若設為true,選擇器將繪制在選中條目的上層。默認為false。
android:fastScrollEnabled// 設置是否允許使用快速滾動滑塊。
android:addStatesFromChildren// 設置這個ViewGroup的drawable狀態是否包括子View的狀態。若設為true,當子View如EditText或Button獲得焦點時,整個ViewGroup也會獲得焦點。
android:alwaysDrawnWithCache// 設置ViewGroup在繪制子View時是否一直使用繪圖緩存。默認為true。
android:animationCache// 設置布局在繪制動畫效果時是否為其子View創建繪圖緩存。若設為true,將會消耗更多的內存,要求持續時間更久的初始化過程,但表現更好。默認為true。
android:clipChildren// 設置子View是否受限於在自己的邊界內繪制。若設為false,當子View所佔用的空間大於邊界時可以繪制在邊界外。默認為true。
android:clipToPadding//定義布局間是否有間距。默認為true。
android:descendantFocusability// 定義當尋找一個焦點View的時候,ViewGroup與其子View之間的關系。可選項為:
//(1)beforeDescendants ViewGroup會比其子View更先獲得焦點;
//(2)afterDescendants 只有當無子View想要獲取焦點時,ViewGroup才會獲取焦點;
//(3)blockDescendants ViewGroup會阻止子View獲取焦點
android:layoutAnimation//定義當ViewGroup第一次展開時的動畫效果,也可人為地在第一次展開後調用。
android:persistentDrawingCache// 定義繪圖緩存的持久性。有如下可選項:
//(1)none 當使用過後不保留繪圖緩存
//(2)animation 在layout animation之後保留繪圖緩存
//(3)scrolling 在Scroll操作後保留繪圖緩存
//(4)all always保留繪圖緩存
android:listSelector// 設置選中項顯示的可繪制對象,可以是圖片或者顏色屬性。
android:scrollingCache// 設置在滾動時是否使用繪制緩存。若設為true,則將使滾動表現更快速,但會佔用更內存。默認為true。
android:smoothScrollbar// 為真時,列表會使用更精確的基於條目在屏幕上的可見像素高度的計算方法。默認該屬性為真,如果你的適配器需要繪制可變高的條目,他應該設為假。當該屬性為真時,你在適配器在顯示變高條目時,滾動條的把手會在滾動的過程中改變大小。當設為假時,列表只使用適配器中的條目數和屏幕上的可見條目來決定滾動條的屬性。
android:stackFromBottom// 設置GridView和ListView是否將內容從底部開始顯示。
android:textFilterEnabled// 當設為真時,列表會將結果過濾為用戶類型。前提是這個列表的Adapter必須支持Filterable介面。
android:transcriptMode//設置列表的transcriptMode.有如下選項可選:
//(1)disabled 禁用TranscriptMode,也是默認值;
//(2)normal 當新條目添加進列表中並且已經准備好顯示的時候,列表會自動滑動到底部以顯示最新條目;
//(3)alwaysScroll 列表會自動滑動到底部,無論新條目是否已經准備好顯示.
目前推薦用的是 RecycleView
❹ android listview 每行中 有兩列。 第二列有兩行的效果是怎麼做的 下圖給圖~
點擊listview某項的事件可用這個: myListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View listitem, int position,long a) { } }); 獲取所選行的電話號碼: 不知道樓主給listview綁數據源的時候用的是什麼數據結構,不過肯定可以通過上面點擊事件中的position參數來從數據源中獲取到所選這行的數據,然後再取這行數據的第三列值,就可以把電話號碼取出來。 撥打電話: 取到電話號碼了,那麼只要這樣就可以調用手機的默認撥號程序 startActivity(new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+"這里寫獲取到的電話號碼")));
❺ 如何把ListView橫向顯示
Android中,默認ListView都是縱向拖動的,橫向拖動常用的有兩種方式:
1、使用Gallery控制項,但該控制項限制較多,很多時候難以滿足我要求。比如:用該控制項選中其中一項時,該項會自動居中,這樣的功能有時是不需要的。因此,該控制項靈活性很小。
2、使用HorizentalScrollView,該控制項可以支持橫向滑動,但是並非使用AdapterView實現,不能管理內存。因此在內容較大較多時,會有內存問題。
❻ android 中listview是怎麼用的
表的顯示需要三個元素:
1.ListVeiw 用來展示列表的View。
2.適配器 用來把數據映射到ListView上的中介。
3.數據 具體的將被映射的字元串,圖片,或者基本組件。
根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最為簡單,只能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對資料庫的簡單結合,可以方面的把資料庫的內容以列表的形式展示出來。
我們從最簡單的ListView開始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* @author allin
*
*/
public class MyListView extends Activity {
private ListView listView;
//private List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
setContentView(listView);
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("測試數據1");
data.add("測試數據2");
data.add("測試數據3");
data.add("測試數據4");
return data;
}
}
上面代碼使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數據的適配器來兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,布局文件(注意這里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系統定義好的布局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的最後工作。運行後的現實結構如下 :
SimpleCursorAdapter
sdk的解釋是這樣的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file. You can specify which columns you want, which views you want to display the columns, and the XML file that defines the appearance of these views。簡單的說就是方便把從游標得到的數據進行列表顯示,並可以把指定的列映射到對應的TextView中。
❼ android中listview怎麼用
創建繼承BaseAdapter並實現其抽象方法的類MyListViewAdapter
說明
下面的講解中,只創建自定義的適配器類,如何使用請參考android中常用控制項的使用之ListView
1.創建類MyListViewAdapter
創建類MyListViewAdapter,該類繼承BaseAdapter,並實現其抽象方法:
1
2
3
4
int getCount();
Object getItem(int position);
long getItemId(int position);
View getView(int position,View convertView,ViewGroup parent);
getCount需要返回有多少個item,也就是說最會在listview中展示這么多行
getItem需要返回參數position位置的數據
getItemId返回position就行了
2.給MyListViewAdapter類添加成員變數和構造方法
兩個成員變數
1
2
List<String> list;
Context context;
list表示要顯示的數據,context變數在生成View對象時需要用到
構造方法:構造方法是為了給兩個成員變數賦值
1
2
3
4
public MyListViewAdapter(List<String> list , Context context) {
this.list = list;
this.context = context;
}
3.給getCount,getItem,getItemId方法添加代碼
getCount需要返回有多少個item,也就是說最會在listview中展示這么多行,所以返回list.size
getItem需要返回參數position位置的數據,也就是list中第position項的值list.get(position)
getItemId返回position就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
4.給getView方法添加代碼
getView方法是返回位置為position的View對象,第二個參數convertView考慮到資源重用問題,在上下滑動的過程中,需要顯示某項的時候才會調用getView方法,而如果有某項被隱藏不顯示,就會把不顯示那一行的View作為convertView參數傳入,如果沒有某項被隱藏,convertView值為null。可以通過下面代碼中的if(convertView!=null)中的輸出來看哪一行被隱藏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("調用getView方法,顯示position="+position+"項");
if(convertView!=null){
TextView t = (TextView) convertView.findViewById(R.id.firstTextView);
System.out.println(t.getText());
}else{
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.item_mylistviewadapter, null);
}
TextView t = (TextView)(convertView.findViewById(R.id.firstTextView));
t.setText(list.get(position));
if(position%2==0)
{
t.setBackgroundColor(Color.WHITE);
}
else{
t.setBackgroundColor(Color.GRAY);
}
return convertView;
}
補充:通過xml生成View對象
通過Context對象生成一個LayoutInflater對象
調用LayoutInflater對象的inflate方法生成控制項對象,inflate方法的第一個參數為xml文件,第二個參數一般為null。返回值為該xml文件最外層的標簽對象。
1
2
LayoutInflater layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout convertView =(LinearLayout)layoutInflater.inflate(R.layout.item_mylistvie
源代碼下載
pan..com/s/1ntuQDdv