在
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代码如下:
<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.OnCreateContextMenuListe
ner;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
public class testListViewAcitivity extends Activity {
private ListView myListView;
@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.setOnCreateContextMenuLi
stener(new OnCreateContextMenuListe
ner() {
@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} //到要實現的控件上
);
在 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代码如下:
|