在上一篇 中,只是实现一个perference,但是点击以后没有响应事件,我们可以定义一个一个Dialog,Dialog选项里面需要有图片,文字说明,后面还需要一个单选按钮,所以自己写了一个demo,效果图如下:
功能的完成是使用Dialog的addView()方法,把一个ListView添加进去。ListView控件里面使用了ImageView和CheckedTextView控件,CheckedTextView是一个提供文字和选择框的控件。如果对于CheckedTextView不熟悉,请自己查下文档,在这里就不在多说。
主要功能代码如下:
public class ListViewActivityextends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button=(Button)findViewById(R.id.button);
//获取ListView
final LayoutInflater factory = LayoutInflater.from(ListViewActivity.this);
final View view = factory.inflate(
R.layout.listview,null);
final ListView list = (ListView) view.findViewById(R.id.ListView01);
//把数据项添加到listItem里面
ArrayList<HashMap<String,Object>> listItem =newArrayList<HashMap<String, Object>>();
for(int i=0;i<5;i++)
{
if(i==0){
HashMap<String,Object> map =new HashMap<String,Object>();
map.put("ItemImage", R.drawable.checked);
map.put("ItemTitle", "1");
listItem.add(map);
}else if(i==1){
HashMap<String,Object> map =new HashMap<String,Object>();
map.put("ItemImage", R.drawable.c);
map.put("ItemTitle", "2");
listItem.add(map);
}else if(i==2){
HashMap<String,Object> map =new HashMap<String,Object>();
map.put("ItemImage", R.drawable.d);
map.put("ItemTitle", "3");
listItem.add(map);
}else if(i==3){
HashMap<String,Object> map =new HashMap<String,Object>();
map.put("ItemImage", R.drawable.d);
map.put("ItemTitle", "4");
listItem.add(map);
}else{
HashMap<String,Object> map =new HashMap<String,Object>();
map.put("ItemImage", R.drawable.e);
map.put("ItemTitle", "5");
listItem.add(map);
}
}
//获得SimpleAdapter,并且把它添加到listView中
SimpleAdapter listItemAdapter =new SimpleAdapter(this,listItem,
R.layout.item,
new String[] {"ItemImage","ItemTitle"},
new int[] {R.id.imageView,R.id.checkedTextView}
);
list.setAdapter(listItemAdapter);
list.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?>arg0, View arg1,int arg2,
long arg3) {
//把所有的单选全部设为非选中
for(int i=0;i<arg0.getCount();i++)
{
View v = list.getChildAt(i);
CheckedTextViewcheckText=(CheckedTextView)v.findViewById(R.id.checkedTextView);
checkText.setChecked(false);
}
//获得点击项的CheckedTextView,并设为选中
CheckedTextViewcheck=(CheckedTextView)arg1.findViewById(R.id.checkedTextView);
check.setChecked(true);
}
});
final AlertDialog.Builder builder=new AlertDialog.Builder(ListViewActivity.this);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
builder.setTitle("Dialog");
builder.setView(list);
builder.setNegativeButton("cencel",null);
builder.create().show();
}
});
}
}
其中item.xml代码如下
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/checkedTextView"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:paddingLeft="6dip"
android:paddingRight="6dip"
/>
</LinearLayout>
Listview.xml文件如下
<?xml version="1.0"encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ListView01"
/>
应该特别注意listview.xml不要把他写在一个父控件下如:LinearLayout等,如果这样会出现错误,。还有就是如果你listview添加过多选项,当单击的时候会出现空指针异常。
另外,Demo源代码可以在此下载。
http://download.csdn.net/source/3494251
2012年7月19号补充:
当listView中含有超过一屏幕的时候,采用以上方法会有空指针异常,是因为未显示的View为空,但是上面代码中要遍历所有代码,所以为空。如何优化,可以参考
ListView Item 选择问题解决之道
这篇文章。