我想做一个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
声明:此代码是模仿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
itemPrice = (String) map.get(keyString[1]);类型是boolean不是String,不要强转为String
为什么是String的?String priceStr[] ={"10","20","25","30","40","50"};
map.put("item_price", priceStr[i]);这样不应该是String型吗?
为什么是String的?String priceStr[] ={"10","20","25","30","40","50"};
map.put("item_price", priceStr[i]);这样不应该是String型吗?keystring里是什么
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里面所有组件名字的数组吗?
你想要的效果应该是 把 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});
你想要的效果应该是 把 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}); 请忽略这个回答。楼上的那位是正解。
十分感谢你的解答。