- 浏览: 94605 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
tztrue:
可以把Linux下生成的jar包进行打包整合,默认情况下生成的 ...
关于android.app.ActivityManagerNative -
tanyq198617:
LZ这篇文章写得不错,很给力!希望在后边能加些小DEMO来说明 ...
Android 学习 -
flower_is:
很受用!谢谢分享啊!
源码目录结构详解 -
damoqiongqiu:
Mark一下,回头用到。
android:webView总结 -
gab26:
太感谢啦,正需要第二种方法而不知道怎么写呢!
HttpClient 4 Post XML到一个服务器(转)
在android系統中,ListView的用法稍微複雜一點,配置Adpater就有幾種方法,如ArrayAdapter,SimpleAdapter等。查了一些網上的相關例子,有很多都是用ListActivity ,然後用Adapter來顯示布局。本例中沒有用到ListActivity 。 ListView是在android中是一個經常用到的控件,ListView裏面的每個子項Item可以使用一個字符串,也可以是一個組合控件,下面是本例將要實現的功能清單:
1.準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
2.構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
3.把 適配器 添加到ListView,并顯示出來;
4.在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應Item的數據,通過getChildAt(0)找控件;
5.實現長按后彈出menu對話框效果;
本文所實現的ListView如下:
UI代碼如下:
設置ListView的 Item樣式 xml文件如下:
到這一步,順便解答上面第4個問題:如何設置在 ListView中調協CheckBox之后還可以執行單擊或長按事件,在Android中 CheckBox的點擊事件優先級比ListView高,當頁面一加載時,會默認聚焦在CheckBox上,為了防止這個問題出來,我們要在Android的控件上的屬性加上Bool值:
android:focusable="false"
最后就是Java源代碼,之后我再一一解答上面的所有問題:
問題:
1.準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
2.構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
3.把 適配器 添加到ListView,并顯示出來;
4.在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應item的數據,通過getChildAt(0)找控件;
5.實現長按后彈出Menu對話框效果;
解答:
1.ListView要顯示的數據, 使用泛型可以方便我們對數據的取舍,使用HashMap,是為了得到key和value之后可以通過key去設置ListView各控件的值
項卡中我們用到的代碼如下:
2.ListView支持多種適配器數據 如:SimpleAdapter和ArrayAdapter,本例使用的是SimpleAdapter,先看看simpleAdapter參數列表,
參數一:上下文,即可以理解為本類;
參數二:支持的數據源,如我們上文定義好的ArrayList<HashMap<String, Object>> ;
參數三:Item的xml實現,上邊我們建立了ListView的Item樣式XML,用法如:R.layout.listview_style
參數四:字符數組,大致意思可以這樣理解,就是“從哪里來”,上文我們通過設置HashMap的鍵值,可以通過如下方式:new String[]{"ItemTitle","ItemText"},
參數五:整形數組,大致意思引用參數四可以這樣理解,“從哪裡來,到哪里去”通過事先from的鍵值to某個控件如:new int[]{R.id.topTextView,R.id.bottomTextView},注意,這里參數五的控件綁定數組要與參數四一一對應;
代碼如下:
3.己經為SimpleAdapter設置好數組了。現在就到了把SimpleAdapter送到ListView身上就可以,代碼如下:
4.代碼簡單,不需要過多解釋;
單擊后如何找到對應的項呢?通過調試發現,ListView的單擊事件會自動定位到我們事先定義好的樣式xml文件,之后我們要做的就是通過setOnItemClickListener自帶的事件參數View把對應的控件找出來,之后我們可以做我們想做的事,通過getChildAt()的下標參數定位控件,然後轉換成需要的可用控件,再取值或賦值,代碼如下:
5.長按顯示對話框的事件為:setOnCreateContextMenuListener,事件參數為:
我們要做的只要在menu使用menu去創建事件選擇按鈕即可,代碼如下:
還需要重寫
這個事件,此事件為執行menu按鍵的事件傳遞,通過Item.getItemId()
方法得到用戶點擊的某個按鈕,然後執行命令,參考代碼如下:
本帖最后由 terryyhl 于 2010-6-5 18:03 编辑
在android系統中,ListView的用法稍微複雜一點,配置Adpater就有幾種方法,如ArrayAdapter,SimpleAdapter等。查了一些網上的相關例子,有很多都是用ListActivity ,然後用Adapter來顯示布局。本例中沒有用到ListActivity 。 ListView是在android中是一個經常用到的控件,ListView裏面的每個子項Item可以使用一個字符串,也可以是一個組合控件,下面是本例將要實現的功能清單:
準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
把 適配器 添加到ListView,并顯示出來;
在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應Item的數據,通過getChildAt(0)找控件;
實現長按后彈出menu對話框效果;
本文所實現的ListView如下:
UI代碼如下:
view sourceprint?01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02 android:orientation="vertical"
03 android:layout_width="fill_parent"
04 android:layout_height="fill_parent"
05 >
06
07
08 <ListView android:id="@+id/ListView01" android:layout_width="wrap_content"
09 android:layout_height="wrap_content"></ListView>
10 </LinearLayout>
設置ListView的 Item樣式 xml文件如下:
view sourceprint?01 <RelativeLayout android:id="@+id/RelativeLayout01"
02 android:layout_width="fill_parent" android:layout_height="wrap_content"
03 android:paddingBottom="4dip"
04 android:paddingLeft="12dip"
05 android:paddingRight="12dip"
06 xmlns:android="http://schemas.android.com/apk/res/android">
07
08 <CheckBox android:id="@+id/CheckBox01"
09 android:layout_alignParentRight="true"
10 android:paddingTop="12dip"
11 android:layout_width="wrap_content"
12 android:focusable="false"
13 android:layout_height="wrap_content"></CheckBox>
14
15 <TextView android:text="TextView1" android:id="@+id/topTextView"
16 android:layout_width="fill_parent"
17 android:textSize="20dip"
18 android:layout_height="wrap_content"></TextView>
19
20
21 <TextView android:text="TextView2" android:id="@+id/bottomTextView"
22 android:layout_below="@+id/topTextView" android:layout_width="fill_parent"
23 android:layout_height="wrap_content"></TextView>
24
25 </RelativeLayout>
到這一步,順便解答上面第4個問題:如何設置在 ListView中調協CheckBox之后還可以執行單擊或長按事件,在Android中 CheckBox的點擊事件優先級比ListView高,當頁面一加載時,會默認聚焦在CheckBox上,為了防止這個問題出來,我們要在Android的控件上的屬性加上Bool值:
android:focusable="false"
最后就是Java源代碼,之后我再一一解答上面的所有問題:
package cn.terry;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
public class testListViewAcitivity extends Activity {
private ListView myListView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView=(ListView)findViewById(R.id.ListView01);
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("ItemTitle", "文章"+i);
map.put("ItemText", "Android 小項目"+i);
listitem.add(map);
}
SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文
listitem, //數據
R.layout.listview_style,//listItem的xml實現
new String[]{"ItemTitle","ItemText"}, //從map的批定Key
new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上
);
myListView.setAdapter(listitemAdapter);
myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
RelativeLayout lr=(RelativeLayout)arg1;
TextView mText=(TextView)lr.getChildAt(1);
Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(),
1000).show();
}
});
myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
ListView lr=(ListView)v;
RelativeLayout myte=(RelativeLayout)lr.getChildAt(0);
TextView dd=(TextView)myte.getChildAt(1);
menu.setHeaderIcon(R.drawable.icon);
menu.setHeaderTitle(dd.getText().toString());
menu.add(1, 0, 0, "高亮");
menu.add(0, 1, 0, "置頂");
}
});
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
String Temp="";
switch (item.getItemId()) {
case 0:
Temp="高亮";
break;
case 1:
Temp="置頂";
break;
default:
break;
}
Toast.makeText(this, Temp+"處理", 1000).show();
return super.onContextItemSelected(item);
}
}
复制代码問題:
準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
把 適配器 添加到ListView,并顯示出來;
在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應item的數據,通過getChildAt(0)找控件;
實現長按后彈出Menu對話框效果;
解答:
ListView要顯示的數據, 使用泛型可以方便我們對數據的取舍,使用HashMap,是為了得到key和value之后可以通過key去設置ListView各控件的值
項卡中我們用到的代碼如下: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("ItemTitle", "文章"+i);
map.put("ItemText", "Android 小項目"+i);
listitem.add(map);
}
复制代码
ListView支持多種適配器數據 如:SimpleAdapter和ArrayAdapter,本例使用的是SimpleAdapter,先看看simpleAdapter參數列表,android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
复制代码參數一:上下文,即可以理解為本類;
參數二:支持的數據源,如我們上文定義好的ArrayList<HashMap<String, Object>> ;
參數三:Item的xml實現,上邊我們建立了ListView的Item樣式XML,用法如:R.layout.listview_style
參數四:字符數組,大致意思可以這樣理解,就是“從哪里來”,上文我們通過設置HashMap的鍵值,可以通過如下方式:new String[]{"ItemTitle","ItemText"},
參數五:整形數組,大致意思引用參數四可以這樣理解,“從哪裡來,到哪里去”通過事先from的鍵值to某個控件如:new int[]{R.id.topTextView,R.id.bottomTextView},注意,這里參數五的控件綁定數組要與參數四一一對應;
代碼如下:SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文
listitem, //數據
R.layout.listview_style,//listItem的xml實現
new String[]{"ItemTitle","ItemText"}, //從map的批定Key
new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上
);
复制代码
己經為SimpleAdapter設置好數組了。現在就到了把SimpleAdapter送到ListView身上就可以,代碼如下:myListView.setAdapter(listitemAdapter);
复制代码
代碼簡單,不需要過多解釋;
單擊后如何找到對應的項呢?通過調試發現,ListView的單擊事件會自動定位到我們事先定義好的樣式xml文件,之后我們要做的就是通過setOnItemClickListener自帶的事件參數View把對應的控件找出來,之后我們可以做我們想做的事,通過getChildAt()的下標參數定位控件,然後轉換成需要的可用控件,再取值或賦值,代碼如下:myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
RelativeLayout lr=(RelativeLayout)arg1;
TextView mText=(TextView)lr.getChildAt(1);
Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(),
1000).show();
}
});
复制代码
長按顯示對話框的事件為:setOnCreateContextMenuListener,事件參數為:void cn.terry.testListViewAcitivity.onCreate(...).新建 OnCreateContextMenuListener() {...}.onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
指定: OnCreateContextMenuListener 中的 onCreateContextMenu(...)
public abstract void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
Since: API Level 1
Called when the context menu for this view is being built. It is not safe to hold onto the menu after this method returns.
Parameters
menu The context menu that is being built
v The view for which the context menu is being built
menuInfo Extra information about the item for which the context menu should be shown. This information will vary depending on the class of v.
复制代码我們要做的只要在menu使用menu去創建事件選擇按鈕即可,代碼如下:menu.setHeaderIcon(R.drawable.icon);
menu.setHeaderTitle(dd.getText().toString());
menu.add(1, 0, 0, "高亮");
menu.add(0, 1, 0, "置頂");
复制代码還需要重寫boolean cn.terry.testListViewAcitivity.onContextItemSelected(MenuItem item)
复制代码這個事件,此事件為執行menu按鍵的事件傳遞,通過Item.getItemId()
方法得到用戶點擊的某個按鈕,然後執行命令,參考代碼如下:public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
String Temp="";
switch (item.getItemId()) {
case 0:
Temp="高亮";
break;
case 1:
Temp="置頂";
break;
default:
break;
}
Toast.makeText(this, Temp+"處理", 1000).show();
return super.onContextItemSelected(item);
}
复制代码
總結:
到此ListView的基本操作己經完成,但還存在問題:
在ListView上實現圖片的動態切換不是很理想;
在ListView上實現長按效果時,想得到其中某一項的Item值無從下手,難道要重寫View?
使用ArrayList<HashMap<String, Object>> listitem必需New,切記!;
1.準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
2.構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
3.把 適配器 添加到ListView,并顯示出來;
4.在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應Item的數據,通過getChildAt(0)找控件;
5.實現長按后彈出menu對話框效果;
本文所實現的ListView如下:
UI代碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/ListView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView> </LinearLayout>
設置ListView的 Item樣式 xml文件如下:
<RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="4dip" android:paddingLeft="12dip" android:paddingRight="12dip" xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBox android:id="@+id/CheckBox01" android:layout_alignParentRight="true" android:paddingTop="12dip" android:layout_width="wrap_content" android:focusable="false" android:layout_height="wrap_content"></CheckBox> <TextView android:text="TextView1" android:id="@+id/topTextView" android:layout_width="fill_parent" android:textSize="20dip" android:layout_height="wrap_content"></TextView> <TextView android:text="TextView2" android:id="@+id/bottomTextView" android:layout_below="@+id/topTextView" android:layout_width="fill_parent" android:layout_height="wrap_content"></TextView> </RelativeLayout>
到這一步,順便解答上面第4個問題:如何設置在 ListView中調協CheckBox之后還可以執行單擊或長按事件,在Android中 CheckBox的點擊事件優先級比ListView高,當頁面一加載時,會默認聚焦在CheckBox上,為了防止這個問題出來,我們要在Android的控件上的屬性加上Bool值:
android:focusable="false"
最后就是Java源代碼,之后我再一一解答上面的所有問題:
package cn.terry; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnCreateContextMenuListener; import android.widget.*; import android.widget.AdapterView.OnItemClickListener; public class testListViewAcitivity extends Activity { private ListView myListView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myListView=(ListView)findViewById(R.id.ListView01); 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("ItemTitle", "文章"+i); map.put("ItemText", "Android 小項目"+i); listitem.add(map); } SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文 listitem, //數據 R.layout.listview_style,//listItem的xml實現 new String[]{"ItemTitle","ItemText"}, //從map的批定Key new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上 ); myListView.setAdapter(listitemAdapter); myListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub RelativeLayout lr=(RelativeLayout)arg1; TextView mText=(TextView)lr.getChildAt(1); Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(), 1000).show(); } }); myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub ListView lr=(ListView)v; RelativeLayout myte=(RelativeLayout)lr.getChildAt(0); TextView dd=(TextView)myte.getChildAt(1); menu.setHeaderIcon(R.drawable.icon); menu.setHeaderTitle(dd.getText().toString()); menu.add(1, 0, 0, "高亮"); menu.add(0, 1, 0, "置頂"); } }); } @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub String Temp=""; switch (item.getItemId()) { case 0: Temp="高亮"; break; case 1: Temp="置頂"; break; default: break; } Toast.makeText(this, Temp+"處理", 1000).show(); return super.onContextItemSelected(item); } }
問題:
1.準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
2.構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
3.把 適配器 添加到ListView,并顯示出來;
4.在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應item的數據,通過getChildAt(0)找控件;
5.實現長按后彈出Menu對話框效果;
解答:
1.ListView要顯示的數據, 使用泛型可以方便我們對數據的取舍,使用HashMap,是為了得到key和value之后可以通過key去設置ListView各控件的值
項卡中我們用到的代碼如下:
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("ItemTitle", "文章"+i); map.put("ItemText", "Android 小項目"+i); listitem.add(map); }
2.ListView支持多種適配器數據 如:SimpleAdapter和ArrayAdapter,本例使用的是SimpleAdapter,先看看simpleAdapter參數列表,
android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
參數一:上下文,即可以理解為本類;
參數二:支持的數據源,如我們上文定義好的ArrayList<HashMap<String, Object>> ;
參數三:Item的xml實現,上邊我們建立了ListView的Item樣式XML,用法如:R.layout.listview_style
參數四:字符數組,大致意思可以這樣理解,就是“從哪里來”,上文我們通過設置HashMap的鍵值,可以通過如下方式:new String[]{"ItemTitle","ItemText"},
參數五:整形數組,大致意思引用參數四可以這樣理解,“從哪裡來,到哪里去”通過事先from的鍵值to某個控件如:new int[]{R.id.topTextView,R.id.bottomTextView},注意,這里參數五的控件綁定數組要與參數四一一對應;
代碼如下:
SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文 listitem, //數據 R.layout.listview_style,//listItem的xml實現 new String[]{"ItemTitle","ItemText"}, //從map的批定Key new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上 );
3.己經為SimpleAdapter設置好數組了。現在就到了把SimpleAdapter送到ListView身上就可以,代碼如下:
myListView.setAdapter(listitemAdapter);
4.代碼簡單,不需要過多解釋;
單擊后如何找到對應的項呢?通過調試發現,ListView的單擊事件會自動定位到我們事先定義好的樣式xml文件,之后我們要做的就是通過setOnItemClickListener自帶的事件參數View把對應的控件找出來,之后我們可以做我們想做的事,通過getChildAt()的下標參數定位控件,然後轉換成需要的可用控件,再取值或賦值,代碼如下:
myListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub RelativeLayout lr=(RelativeLayout)arg1; TextView mText=(TextView)lr.getChildAt(1); Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(), 1000).show(); } });
5.長按顯示對話框的事件為:setOnCreateContextMenuListener,事件參數為:
void cn.terry.testListViewAcitivity.onCreate(...).新建 OnCreateContextMenuListener() {...}.onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 指定: OnCreateContextMenuListener 中的 onCreateContextMenu(...) public abstract void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) Since: API Level 1 Called when the context menu for this view is being built. It is not safe to hold onto the menu after this method returns. Parameters menu The context menu that is being built v The view for which the context menu is being built menuInfo Extra information about the item for which the context menu should be shown. This information will vary depending on the class of v.
我們要做的只要在menu使用menu去創建事件選擇按鈕即可,代碼如下:
menu.setHeaderIcon(R.drawable.icon); menu.setHeaderTitle(dd.getText().toString()); menu.add(1, 0, 0, "高亮"); menu.add(0, 1, 0, "置頂");
還需要重寫
boolean cn.terry.testListViewAcitivity.onContextItemSelected(MenuItem item)
這個事件,此事件為執行menu按鍵的事件傳遞,通過Item.getItemId()
方法得到用戶點擊的某個按鈕,然後執行命令,參考代碼如下:
public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub String Temp=""; switch (item.getItemId()) { case 0: Temp="高亮"; break; case 1: Temp="置頂"; break; default: break; } Toast.makeText(this, Temp+"處理", 1000).show(); return super.onContextItemSelected(item); }
本帖最后由 terryyhl 于 2010-6-5 18:03 编辑
在android系統中,ListView的用法稍微複雜一點,配置Adpater就有幾種方法,如ArrayAdapter,SimpleAdapter等。查了一些網上的相關例子,有很多都是用ListActivity ,然後用Adapter來顯示布局。本例中沒有用到ListActivity 。 ListView是在android中是一個經常用到的控件,ListView裏面的每個子項Item可以使用一個字符串,也可以是一個組合控件,下面是本例將要實現的功能清單:
準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
把 適配器 添加到ListView,并顯示出來;
在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應Item的數據,通過getChildAt(0)找控件;
實現長按后彈出menu對話框效果;
本文所實現的ListView如下:
UI代碼如下:
view sourceprint?01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02 android:orientation="vertical"
03 android:layout_width="fill_parent"
04 android:layout_height="fill_parent"
05 >
06
07
08 <ListView android:id="@+id/ListView01" android:layout_width="wrap_content"
09 android:layout_height="wrap_content"></ListView>
10 </LinearLayout>
設置ListView的 Item樣式 xml文件如下:
view sourceprint?01 <RelativeLayout android:id="@+id/RelativeLayout01"
02 android:layout_width="fill_parent" android:layout_height="wrap_content"
03 android:paddingBottom="4dip"
04 android:paddingLeft="12dip"
05 android:paddingRight="12dip"
06 xmlns:android="http://schemas.android.com/apk/res/android">
07
08 <CheckBox android:id="@+id/CheckBox01"
09 android:layout_alignParentRight="true"
10 android:paddingTop="12dip"
11 android:layout_width="wrap_content"
12 android:focusable="false"
13 android:layout_height="wrap_content"></CheckBox>
14
15 <TextView android:text="TextView1" android:id="@+id/topTextView"
16 android:layout_width="fill_parent"
17 android:textSize="20dip"
18 android:layout_height="wrap_content"></TextView>
19
20
21 <TextView android:text="TextView2" android:id="@+id/bottomTextView"
22 android:layout_below="@+id/topTextView" android:layout_width="fill_parent"
23 android:layout_height="wrap_content"></TextView>
24
25 </RelativeLayout>
到這一步,順便解答上面第4個問題:如何設置在 ListView中調協CheckBox之后還可以執行單擊或長按事件,在Android中 CheckBox的點擊事件優先級比ListView高,當頁面一加載時,會默認聚焦在CheckBox上,為了防止這個問題出來,我們要在Android的控件上的屬性加上Bool值:
android:focusable="false"
最后就是Java源代碼,之后我再一一解答上面的所有問題:
package cn.terry;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
public class testListViewAcitivity extends Activity {
private ListView myListView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView=(ListView)findViewById(R.id.ListView01);
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("ItemTitle", "文章"+i);
map.put("ItemText", "Android 小項目"+i);
listitem.add(map);
}
SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文
listitem, //數據
R.layout.listview_style,//listItem的xml實現
new String[]{"ItemTitle","ItemText"}, //從map的批定Key
new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上
);
myListView.setAdapter(listitemAdapter);
myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
RelativeLayout lr=(RelativeLayout)arg1;
TextView mText=(TextView)lr.getChildAt(1);
Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(),
1000).show();
}
});
myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
ListView lr=(ListView)v;
RelativeLayout myte=(RelativeLayout)lr.getChildAt(0);
TextView dd=(TextView)myte.getChildAt(1);
menu.setHeaderIcon(R.drawable.icon);
menu.setHeaderTitle(dd.getText().toString());
menu.add(1, 0, 0, "高亮");
menu.add(0, 1, 0, "置頂");
}
});
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
String Temp="";
switch (item.getItemId()) {
case 0:
Temp="高亮";
break;
case 1:
Temp="置頂";
break;
default:
break;
}
Toast.makeText(this, Temp+"處理", 1000).show();
return super.onContextItemSelected(item);
}
}
复制代码問題:
準備ListView要顯示的數據,使用一維或多維 動態數組 保存數據;
構建 適配器,適配器就是Item數組,動態數組有多少元素就生成多少個Item;
把 適配器 添加到ListView,并顯示出來;
在ListView的Item添加CheckBox并可以執行單擊事件,設置單擊事件,對應的Item顯示對應item的數據,通過getChildAt(0)找控件;
實現長按后彈出Menu對話框效果;
解答:
ListView要顯示的數據, 使用泛型可以方便我們對數據的取舍,使用HashMap,是為了得到key和value之后可以通過key去設置ListView各控件的值
項卡中我們用到的代碼如下: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("ItemTitle", "文章"+i);
map.put("ItemText", "Android 小項目"+i);
listitem.add(map);
}
复制代码
ListView支持多種適配器數據 如:SimpleAdapter和ArrayAdapter,本例使用的是SimpleAdapter,先看看simpleAdapter參數列表,android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
复制代码參數一:上下文,即可以理解為本類;
參數二:支持的數據源,如我們上文定義好的ArrayList<HashMap<String, Object>> ;
參數三:Item的xml實現,上邊我們建立了ListView的Item樣式XML,用法如:R.layout.listview_style
參數四:字符數組,大致意思可以這樣理解,就是“從哪里來”,上文我們通過設置HashMap的鍵值,可以通過如下方式:new String[]{"ItemTitle","ItemText"},
參數五:整形數組,大致意思引用參數四可以這樣理解,“從哪裡來,到哪里去”通過事先from的鍵值to某個控件如:new int[]{R.id.topTextView,R.id.bottomTextView},注意,這里參數五的控件綁定數組要與參數四一一對應;
代碼如下:SimpleAdapter listitemAdapter=new SimpleAdapter(this,//上下文
listitem, //數據
R.layout.listview_style,//listItem的xml實現
new String[]{"ItemTitle","ItemText"}, //從map的批定Key
new int[]{R.id.topTextView,R.id.bottomTextView} //到要實現的控件上
);
复制代码
己經為SimpleAdapter設置好數組了。現在就到了把SimpleAdapter送到ListView身上就可以,代碼如下:myListView.setAdapter(listitemAdapter);
复制代码
代碼簡單,不需要過多解釋;
單擊后如何找到對應的項呢?通過調試發現,ListView的單擊事件會自動定位到我們事先定義好的樣式xml文件,之后我們要做的就是通過setOnItemClickListener自帶的事件參數View把對應的控件找出來,之后我們可以做我們想做的事,通過getChildAt()的下標參數定位控件,然後轉換成需要的可用控件,再取值或賦值,代碼如下:myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
RelativeLayout lr=(RelativeLayout)arg1;
TextView mText=(TextView)lr.getChildAt(1);
Toast.makeText(testListViewAcitivity.this, "你點擊了第"+arg2+"項的"+mText.getText().toString(),
1000).show();
}
});
复制代码
長按顯示對話框的事件為:setOnCreateContextMenuListener,事件參數為:void cn.terry.testListViewAcitivity.onCreate(...).新建 OnCreateContextMenuListener() {...}.onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
指定: OnCreateContextMenuListener 中的 onCreateContextMenu(...)
public abstract void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
Since: API Level 1
Called when the context menu for this view is being built. It is not safe to hold onto the menu after this method returns.
Parameters
menu The context menu that is being built
v The view for which the context menu is being built
menuInfo Extra information about the item for which the context menu should be shown. This information will vary depending on the class of v.
复制代码我們要做的只要在menu使用menu去創建事件選擇按鈕即可,代碼如下:menu.setHeaderIcon(R.drawable.icon);
menu.setHeaderTitle(dd.getText().toString());
menu.add(1, 0, 0, "高亮");
menu.add(0, 1, 0, "置頂");
复制代码還需要重寫boolean cn.terry.testListViewAcitivity.onContextItemSelected(MenuItem item)
复制代码這個事件,此事件為執行menu按鍵的事件傳遞,通過Item.getItemId()
方法得到用戶點擊的某個按鈕,然後執行命令,參考代碼如下:public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
String Temp="";
switch (item.getItemId()) {
case 0:
Temp="高亮";
break;
case 1:
Temp="置頂";
break;
default:
break;
}
Toast.makeText(this, Temp+"處理", 1000).show();
return super.onContextItemSelected(item);
}
复制代码
總結:
到此ListView的基本操作己經完成,但還存在問題:
在ListView上實現圖片的動態切換不是很理想;
在ListView上實現長按效果時,想得到其中某一項的Item值無從下手,難道要重寫View?
使用ArrayList<HashMap<String, Object>> listitem必需New,切記!;
发表评论
-
避免内存泄露
2010-10-19 15:45 994Android应用程序被限制在16MB的堆上运行,至少在T-M ... -
关于android.app.ActivityManagerNative
2010-10-11 15:03 15183由于想在程序里面更改系统的语言设置,查看了Settings中的 ... -
android系统中自带的图标大全
2010-10-11 11:16 1205Android™ 1.6 android.R.drawable ... -
事件处理
2010-10-09 16:52 935ctivity和VIEW都能接收触摸和按键,如果响应事件只需要 ... -
PreferenceActivity用法简介
2010-09-27 16:28 4119在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那 ... -
Android Permission大全
2010-09-25 16:45 1264Android Permission大全 Andro ... -
Android 学习
2010-09-16 13:07 1278Service 服务,从最直白的视角来看,就是剥离了界面 ... -
Android 的动作、广播、类别等标识大全
2010-09-16 11:51 1827String BATTERY_CHANGED_ACTION ... -
Android电源管理
2010-09-16 10:37 5893Android电源管理 一、 相关概念 1. ... -
Android本地广播相关操作分析
2010-09-15 23:21 1213Android给许多系统服务广播Intent。你可以使用这些基 ... -
版本检测及更新
2010-09-15 09:42 1791使得应用可通过后台自动检查是否有最新版本,如果需要更新当前版本 ... -
屏保软件的开发
2010-09-11 11:26 1471Android作为一个新兴的手机智能操作系统已经越来越热门,关 ... -
源码目录结构详解
2010-09-11 11:00 1862Android 2.1 |-- Makefile |-- bi ... -
Android 自定义 dialog
2010-09-07 09:56 1972Andoid Dialog 1、AlertDialog,具有 ... -
simpleCursorAdapter 和 sqlite
2010-09-05 11:39 1674关于这一部分,必须注意sqlite的主键命名,由于simple ... -
android 列表视图组件 ListView 详解
2010-09-03 10:09 3804在android开发中ListView是比较常用的组件,它以列 ... -
android:webView总结
2010-08-26 14:18 2008大部分内容为网上整理 ... -
为程序添加版本自动更新功能(转)
2010-08-25 17:19 1118OverView : 程序 通过后台每天检查是否有最新版本, ...
相关推荐
在Android应用开发中,ListView是常用的视图组件,它用于展示大量的列表数据。这个压缩包文件"Android--开发--ListView 实现点击侧边A-Z快速查找.rar"显然包含了一个示例,展示了如何在ListView中实现点击侧边字母...
Android移动应用开发之使用ListView+SQLiteOpenHelper实现商品列表添加删除的界面 能够输入数据然后添加到数据库,ListView会自动展现数据库的内容,点击删除能够将数据库中的信息删除并更新ListView 实现思路: 1....
在Android开发中,ListView是一种常用的UI组件,用于展示大量数据列表。它允许用户滚动查看信息,同时提供了多种可定制的交互方式。本话题主要探讨如何在ListView中集成EditText和CheckBox,以实现更具交互性的功能...
•Android---UI篇---Tab Layout(选项卡布局) • •Andorid---UI篇---TableLayout(表格布局) ...•Android---UI篇---ListView之SimpleCursorAdapter(列表)---3 • •Android---UI篇---Menu(菜单)
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要结合EditText和Checkbox来实现用户交互,例如编辑列表项、选择列表项等。"Listview+Edittext+Checkdemo"就是一个...
这个项目“android轮播+动态gif+音乐+抽屉菜单+Listview+WebView”就涵盖了这些关键点,让我们逐一深入探讨。 首先,**轮播图片(Banner)**是移动应用中常见的设计元素,用于展示广告、特色内容或导航。在Android...
在Android应用开发中,RecyclerView是取代ListView的一种更高效、更灵活的列表视图组件。它提供了许多高级功能,包括但不限于滚动性能优化、动画支持以及自定义布局管理器。本篇文章将详细探讨如何在Android中使用...
在Android开发中,自定义Dialog是一种常见的需求,用于提供一种轻量级的用户交互界面,如提示信息或者进行选择操作。本示例是关于如何创建一个具有多选功能的Dialog,结合了Dialog、ListView和CheckBox的使用。下面...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据的列表形式。在这个"Android之ListView+BaseAdapter左右按键切换"的项目中,我们将会深入探讨如何利用ListView结合BaseAdapter实现通过键盘左右...
在实际应用中,我们经常需要实现一个功能,让用户能够选择ListView中的多个条目进行批量删除,这正是"Android ListView+checkbox 实现批量删除"这个主题所涵盖的知识点。下面我们将详细探讨如何在Android中实现这一...
- **Preference**: 支持创建设置界面,提供了各种偏好设置控件,如开关按钮、选择器等,简化了设置界面的构建。 - **NotificationCompat**: 提供了一致的通知API,使开发者能够在不同版本的Android上创建一致外观和...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。`Android-SlideListView(ListView侧滑实现)`项目是针对ListView进行的一种扩展,它引入了侧滑手势来实现更多的交互功能,如滑动删除和滑动展开...
在Android开发中,"ListView+SurfaceView视频播放"是一个常见的需求,特别是在构建视频列表应用时。这个主题涉及到了两个核心组件:ListView和SurfaceView,以及如何将它们结合起来实现流畅的视频播放体验。以下是对...
在Android开发中,ListView是常用的数据展示组件,用于显示大量数据列表。然而,原生的ListView功能相对简单,不支持一些高级交互,如拖拽排序和滑动删除。本资源"drag-sort-listview"提供了一个自定义的ListView...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。在许多场景下,我们需要在ListView中加入复选框(Checkbox),实现多选功能,例如用户可以选择多个项目进行操作。本文将详细介绍如何在Android中...
在Android应用开发中,ListView是常用的视图组件,用于展示大量的数据列表。为了提供更丰富的交互体验,开发者经常需要自定义ListView,实现如滑动删除Item等高级功能。本篇文章将详细讲解如何在Android中通过自定义...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。此源码示例主要涉及了ListView与CheckBox结合的高级应用,实现了全选、全不选以及删除功能,这些都是在开发中经常遇到的需求。下面我们将详细...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。而当我们在ListView的每一项(Item)中加入复选框(Checkbox)时,可以实现用户对多项数据的选择操作。"android listview+checkbox示例"是针对...
在Android开发中,ListView是一种常用的UI组件,常用于展示大量数据列表。本教程将详细介绍如何在ListView中实现带标题栏的效果。标题栏通常用于显示分类信息或者操作按钮,为用户提供更好的交互体验。以下是对实现...