http://mobile.51cto.com/android-254823.htm
项目要用到一个listview,要求是可以显示图片,后面还有有复选框。
先新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,我这儿由于是测试的,所以把数据写死了。
Java代码
- packagecom.zwq.umeng;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.content.Context;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.CheckBox;
- importandroid.widget.ImageView;
- importandroid.widget.TextView;
- publicclassMyAdapterextendsBaseAdapter{
- privateLayoutInflatermInflater;
- privateList<Map<String,Object>>mData;
- publicstaticMap<Integer,Boolean>isSelected;
- publicMyAdapter(Contextcontext){
- mInflater=LayoutInflater.from(context);
- init();
- }
- //初始化
- privatevoidinit(){
- mData=newArrayList<Map<String,Object>>();
- for(inti=0;i<5;i++){
- Map<String,Object>map=newHashMap<String,Object>();
- map.put("img",R.drawable.icon);
- map.put("title","第"+(i+1)+"行的标题");
- mData.add(map);
- }
- //这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。
- isSelected=newHashMap<Integer,Boolean>();
- for(inti=0;i<mData.size();i++){
- isSelected.put(i,false);
- }
- }
- @Override
- publicintgetCount(){
- returnmData.size();
- }
- @Override
- publicObjectgetItem(intposition){
- returnnull;
- }
- @Override
- publiclonggetItemId(intposition){
- return0;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder=null;
- //convertView为null的时候初始化convertView。
- if(convertView==null){
- holder=newViewHolder();
- convertView=mInflater.inflate(R.layout.vlist,null);
- holder.img=(ImageView)convertView.findViewById(R.id.img);
- holder.title=(TextView)convertView.findViewById(R.id.title);
- holder.cBox=(CheckBox)convertView.findViewById(R.id.cb);
- convertView.setTag(holder);
- }else{
- holder=(ViewHolder)convertView.getTag();
- }
- holder.img.setBackgroundResource((Integer)mData.get(position).get(
- "img"));
- holder.title.setText(mData.get(position).get("title").toString());
- holder.cBox.setChecked(isSelected.get(position));
- returnconvertView;
- }
- publicfinalclassViewHolder{
- publicImageViewimg;
- publicTextViewtitle;
- publicCheckBoxcBox;
- }
- }
上面类中要注意getView()方法中对数据的处理。
接下要新建一个list.xml文件,这个就是布局image、textview、checkbox。
Java代码
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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/img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"/>
- <TextView
- android:id="@+id/title"
- android:textSize="18dip"
- android:layout_weight="1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <CheckBox
- android:id="@+id/cb"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:clickable="false"
- android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
- </LinearLayout>
android:layout_weight="1"这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:clickable="false"
这三句很重要,如果不加就会出现错误。
由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。
接下来在main.xml中添加Listview组件
Java代码
- <ListView
- android:id="@+id/lv"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
接下来就是在activity中调用:
Java代码
- list=(ListView)findViewById(R.id.lv);
- MyAdapteradapter=newMyAdapter(this);
- list.setAdapter(adapter);
- list.setItemsCanFocus(false);
- list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- list.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,
- intposition,longid){
- ViewHoldervHollder=(ViewHolder)view.getTag();
- //在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。
- vHollder.cBox.toggle();
- MyAdapter.isSelected.put(position,vHollder.cBox.isChecked());
- }
- });
最新看一下效果图:
要获取哪些项目被选择了,可以这样测试:
Java代码
- OnClickListenerbPop=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- for(inti=0;i<list.getCount();i++){
- if(MyAdapter.isSelected.get(i)){
- ViewHoldervHollder=(ViewHolder)list.getChildAt(i).getTag();
- Log.i(TAG,"--onClick--"+vHollder.title.getText());
- }
- }
- }
- };