我想做一个listview,这个listview里面的每一个Item有两个一个checkbox。listview如果只是放一个textview和一个checkBOX的时候就可以,但是如果我修改成两个就不行。下面是代码:
声明:此代码是模仿http://www.apkbus.com/android-18656-1-1.html里面的,个人觉得很好,新手可以一起学习。
   MainActivity类:
package com.example.checkbox;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {
TextView tv = null;
ListView lv = null;
TextView price = null;
String name[] = {"G1","G2","G3","G4","G5","G6"};
String priceStr[] ={"10","20","25","30","40","50"};
ArrayList <String> listStr = null;
private List<HashMap<String, Object>> list = null;
private MyAdapter adapter = null;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this.findViewById(R.id.text);
price = (TextView) this.findViewById(R.id.item_price);
lv = (ListView) this.findViewById(R.id.listview);
showCheckBoxListView();

}

public void showCheckBoxListView(){
list = new ArrayList<HashMap<String,Object>>();
for(int i = 0;i<name.length;i++){
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("item_tv", name[i]);
map.put("item_price", priceStr[i]);
map.put("item_cb", false);
list.add(map);

adapter = new MyAdapter(this,list,R.layout.list,new String[]{"item_tv","item_cb"},new int[]{R.id.item_tv,R.id.item_cb});
lv.setAdapter(adapter);
listStr = new ArrayList<String>();
lv.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.cb.toggle();//在每次获得点击时,都获得checkbox的状态的改变
MyAdapter.isSelect.put(position, holder.cb.isChecked());//同时修改map值得保存状态
if(holder.cb.isChecked() == true){
          listStr.add(name[position]);
          
}else{
listStr.remove(name[position]);
}
tv.setText("以选中"+ listStr.size()+"项");
}
});
}
}

@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;
}





/*************MyAdapter类**********************************/
public static class MyAdapter extends BaseAdapter{
public static HashMap<Integer,Boolean> isSelect = null;
private Context context = null;
private LayoutInflater inflater = null;  
private List<HashMap<String,Object>> list = null;
private String keyString[] = null;
private int idValue[] = null;
private String itemName = null;  //作为每一项item中的textview显示的
private String itemPrice = null; 


public MyAdapter(Context context,List<HashMap<String,Object>> list,int resource ,String[] from,int[] to){
this.context = context;
this.list = list;
keyString = new String[from.length];
idValue = new int[to.length];
System.arraycopy(from, 0, keyString, 0, from.length);
System.arraycopy(to, 0, idValue, 0, to.length);
inflater = LayoutInflater.from(context);
init();

}


public void init(){
isSelect = new HashMap<Integer, Boolean>();
for(int i=0;i<list.size();i++){
isSelect.put(i, false);
}
}
@Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View view, ViewGroup arg2) {
ViewHolder holder = null;
if(holder == null){
holder = new ViewHolder();
if(view == null){
view = inflater.inflate(R.layout.list, null);
}
holder.tv = (TextView) view.findViewById(R.id.item_tv);
holder.price = (TextView) view.findViewById(R.id.item_price);
holder.cb = (CheckBox) view.findViewById(R.id.item_cb);
view.setTag(holder);

}else{
holder = (ViewHolder)view.getTag();
}
HashMap<String,Object> map = list.get(position);
if(map != null){
itemName = (String) map.get(keyString[0]);
itemPrice = (String) map.get(keyString[1]);
holder.tv.setText(itemName);
holder.price.setText(itemPrice);
}
holder.cb.setChecked(isSelect.get(position));
return view;
}

}}
ViewHolder类
package com.example.checkbox;import android.widget.CheckBox;
import android.widget.TextView;public class ViewHolder {
public TextView tv = null;
public TextView price = null;
public CheckBox cb = null; 

}
activity_main的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity" >    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />    <ListView
        android:id="@+id/listview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ></ListView>
    </LinearLayout>
    
</LinearLayout>
list.xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="55dip"  
    android:orientation="horizontal"  
    android:layout_marginTop="20dip">   
    
    <TextView 
        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:layout_marginLeft="10dip">
    </TextView> 
    <TextView 
        android:id="@+id/item_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    
    
    <CheckBox
        android:id="@+id/item_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="43dp"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false" /></RelativeLayout>
报错的信息是09-17 02:42:24.745: E/AndroidRuntime(3032): FATAL EXCEPTION: main
09-17 02:42:24.745: E/AndroidRuntime(3032): java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
09-17 02:42:24.745: E/AndroidRuntime(3032):  at com.example.checkbox.MainActivity$MyAdapter.getView(MainActivity.java:152)
checkboxlistview

解决方案 »

  1.   

    152行
    itemPrice = (String) map.get(keyString[1]);类型是boolean不是String,不要强转为String
      

  2.   


    为什么是String的?String priceStr[] ={"10","20","25","30","40","50"};
    map.put("item_price", priceStr[i]);这样不应该是String型吗?
      

  3.   


    为什么是String的?String priceStr[] ={"10","20","25","30","40","50"};
    map.put("item_price", priceStr[i]);这样不应该是String型吗?keystring里是什么
      

  4.   

    Adapter的构造方法
    public MyAdapter(Context context,List<HashMap<String,Object>> list,int resource ,String[] from,int[] to){
    keyString = new String[from.length];
    System.arraycopy(from, 0, keyString, 0, from.length);
    这样子的话,keyString不是一个装listview里面所有组件名字的数组吗?
      

  5.   

    itemPrice = (String) map.get(keyString[1]); 把152行 改为 itemPrice = "" +  map.get(keyString[1]);
      

  6.   

    49行 map.put("item_cb", false);52行 adapter = new MyAdapter(this,list,R.layout.list,new String[]{"item_tv","item_cb"},new int[]{R.id.item_tv,R.id.item_cb});152行itemPrice = (String) map.get(keyString[1]);请仔细看你这个  keyString[1] 其实是 item_cb可能是你疏忽吧
    你想要的效果应该是  把 52行 改为以下内容 adapter = new MyAdapter(this,list,R.layout.list,new String[]{"item_tv","item_price"},new int[]{R.id.item_tv,R.id.item_cb}); 
      

  7.   

    可能是你疏忽吧
    你想要的效果应该是  把 52行 改为以下内容 adapter = new MyAdapter(this,list,R.layout.list,new String[]{"item_tv","item_price"},new int[]{R.id.item_tv,R.id.item_cb}); 请忽略这个回答。楼上的那位是正解。
      

  8.   

    的确如此,原来真的是我没有把item_price 放进数组,以至于KeyString[1]是boolean变量。
    十分感谢你的解答。