当前位置:编程学习 > wap >>

求高手回答下这个带CheckBox的ListView的问题

学android也好些时间了,最近都在自己做一个文件的管理程序,做的过程发现了这个棘手的问题,先上个图给大家介绍下我出现的问题 

当我点击了一个checkBox的时候,会变得很卡,根本不能再点别的了,点文件夹完全不行,点文件好点。下面是我的源码,希望高手给我解答下,不胜感激啊。
自定义的ListView显示item布局:list_item.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="wrap_content"  
        >  
        <ImageView   
            android:id="@+id/fileTypeImage"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentLeft="true"  
            android:layout_centerVertical="true"  
            android:src="@drawable/filemanager"  
            />  
        <LinearLayout   
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_toRightOf="@id/fileTypeImage"  
            android:layout_alignTop="@id/fileTypeImage"  
            android:paddingLeft="15dp"  
            android:orientation="vertical"  
            >  
            <LinearLayout   
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:orientation="horizontal"  
                >  
                <TextView   
                    android:id="@+id/fileName"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:textSize="25sp"  
                    android:text="fileName"  
                    />  
                <TextView   
                    android:id="@+id/childFileNum"  
                    android:paddingLeft="10dp"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:textSize="25sp"  
                    android:text="(20)"  
                    />  
            </LinearLayout>  
            <LinearLayout   
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:orientation="horizontal"  
                >  
                <TextView   
                    android:id="@+id/createTime"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:textSize="15sp"  
                    android:text="2011-01-01"  
                    />  
                <TextView   
                    android:id="@+id/fileSize"  
                    android:paddingLeft="10dp"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:textSize="15sp"  
                    android:text="80MB"  
                    />  
            </LinearLayout>  
        </LinearLayout>  
        <CheckBox   
            android:id="@+id/checkbox"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentRight="true"  
            android:layout_centerVertical="true"  
            android:clickable="false"    
            android:focusable="false"    
            android:focusableInTouchMode="false"   
            />  
    </RelativeLayout>  

下面是我的关键处理java代码:

package org.hwq.filedemo2;  
  
import java.io.File;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
  
import org.hwq.filedemo2.util.FileUtil;  
  
import android.app.Activity;  
import android.content.Context;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.view.animation.AlphaAnimation;  
import android.view.animation.Animation;  
import android.view.animation.AnimationSet;  
import android.view.animation.LayoutAnimationController;  
import android.view.animation.TranslateAnimation;  
import android.widget.BaseAdapter;  
import android.widget.CheckBox;  
import android.widget.CompoundButton;  
import android.widget.ImageView;  
import android.widget.LinearLayout;  
import android.widget.ListView;  
import android.widget.TextView;  
  
public class ListShowActivity extends Activity {  
    private File root = new File("/");//根目录  
    private String currentPath = "/";//当前目录  
    private List<String> childFiles = new ArrayList<String>();//当前目录中的所有文件及目录(已排序好的)  
    private List<String> checkedFiles = new ArrayList<String>();//选中文件  
    private boolean copyFlag = false;  
    ListView lv;  
    List<Map<String,String>> data;  
    LinearLayout optionGroup ;  
    LinearLayout pasteGroup ;  
 
    ........
      
    public final class Holder{    
        public ImageView fileTypeImage;    
        public TextView fileName;    
        public TextView childFileNum;    
        public TextView createTime;    
        public TextView fileSize;    
        public CheckBox checkbox;    
    }    
    //自定义适配器  
    public class MyAdapter extends BaseAdapter{    
        private List<Boolean> checked;  
        private LayoutInflater inflater;  
        private Map<Integer,View> map = new HashMap<Integer,View>();  
        public MyAdapter(Context context){    
            inflater = LayoutInflater.from(context);    
            checked = new ArrayList<Boolean>();  
            for(int i=0;i<data.size();i++){  
                checked.add(false);  
            }  
        }    
        public int getCount() {    
            return data.size();    
        }    
        public Object getItem(int position) {    
            return data.get(position);    
        }    
        public long getItemId(int position) {    
            return position;    
        }    
        public View getView(int position, View convertView, ViewGroup parent) {    
            View v;  
            Holder holder = null;    
            if(map.get(position) == null){    
                holder = new Holder();    
                v = inflater.inflate(R.layout.list_item, null);    
                holder.fileTypeImage = (ImageView) v.findViewById(R.id.fileTypeImage);    
                holder.fileName = (TextView) v.findViewById(R.id.fileName);    
                holder.childFileNum = (TextView) v.findViewById(R.id.childFileNum);    
                holder.createTime = (TextView) v.findViewById(R.id.createTime);    
                holder.fileSize = (TextView) v.findViewById(R.id.fileSize);    
                holder.checkbox = (CheckBox) v.findViewById(R.id.checkbox);  
                final int p = position;  
                holder.checkbox.setOnClickListener(new OnClickListener() {  
                    public void onClick(View v) {  
                        //多选框选中处理流程  
                        CheckBox checkBox = (CheckBox) v;  
                        checked.set(p,checkBox.isChecked());  
                        if(checkBox.isChecked()){  
                            checkedFiles.add(childFiles.get(p));  
                        }else{  
                            checkedFiles.remove(childFiles.get(p));  
                        }  
                        showOptionGroup();  
                    }  
                });  
                map.put(position, v);  
                v.setTag(holder);    
            }else{    
                v = map.get(position);  
                holder = (Holder) v.getTag();    
            }    
                
              holder.fileTypeImage.setImageResource(Integer.parseInt(data.get(position).get("fileTypeImage")));    
            holder.fileName.setText(data.get(position).get("fileName"));    
            holder.childFileNum.setText(data.get(position).get("childFileNum"));    
            holder.createTime.setText(data.get(position).get("createTime"));    
            holder.fileSize.setText(data.get(position).get("fileSize"));    
            holder.checkbox.setChecked(checked.get(position));  
            return v;    
        }  
      


代码有点长,注释也太少(主要是这个只是个练手小程序,代码量不多),希望大家谅解下,能耐心看下,我的判断是在自定义的MyAdapter里面处理getView中的CheckBox事件的时候出的问题,但是这里只是链表List的操作,不至于会这样卡的。但是想想又不是,一个List里就不会放多少文件引用,不可能会导致现在程序里的卡。实在是想不出哪里出的问题,希望高手能解答下。不胜感激啊。
如果有啥问题,可以邮箱告诉我,一定会回的。邮箱地址:huangwqit@163.com
下面附上些的完整代码程序。

http://dl.iteye.com/topics/download/6c04731e-6156-3477-8c74-a0df0bd8a893 --------------------编程问答-------------------- 源代码看不了啊

我没法去运行,但是感觉,你把holder.checkbox.setOnClickListener放在if(map.get(position)   ==   null){}里边不太合适吧?应该放在 if  -- else 之后吧? --------------------编程问答-------------------- 我也做过类似的,我的处理方法是
1.将你的private   List <Boolean>   checked;换成public static Map<Integer, Boolean> isSelected;
Map中Integer是listview点击的项,boolean是是否选中
2.在listviewItemOnClick事件中就是这样
/**
* listview点击事件
 */
private class lv_OnItemClick implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
long id) {
ViewHolder vh = (ViewHolder) view.getTag();
vh.cBox.toggle();
                        //adapter是全局非静态的
adapter.isSelected.put(position, vh.cBox.isChecked());
}
};
我不知道这符合不符合你的要求,反正我是实现了选中就勾住,再点一次就取消选中
给你参考吧 --------------------编程问答-------------------- 大家可以下我的源码来看下http://dl.iteye.com/topics/download/6c04731e-6156-3477-8c74-a0df0bd8a893
我现在的问题是,当我点击选中一个checkbox的时候,就卡住了,别的checkbox不能选。 --------------------编程问答--------------------
引用 3 楼 ubdc003 的回复:
大家可以下我的源码来看下http://dl.iteye.com/topics/download/6c04731e-6156-3477-8c74-a0df0bd8a893
我现在的问题是,当我点击选中一个checkbox的时候,就卡住了,别的checkbox不能选。

大哥,你就不会传到CSDN啊 --------------------编程问答--------------------
引用 2 楼 fire_fire_fire 的回复:
我也做过类似的,我的处理方法是
1.将你的private   List <Boolean>   checked;换成public static Map<Integer, Boolean> isSelected;
Map中Integer是listview点击的项,boolean是是否选中
2.在listviewItemOnClick事件中就是这样
/**
* listview点击事件
……

我这个是做的一个文件管理器,我估计这样不行,因为,我点击一个文件的View的时候,是要进入到这个目录去的。而不是选中checkbox。我的想法只是点击了checkbox才选中,然后实现多文件操作 --------------------编程问答--------------------
引用 4 楼 licaiyuren 的回复:
引用 3 楼 ubdc003 的回复:

大家可以下我的源码来看下http://dl.iteye.com/topics/download/6c04731e-6156-3477-8c74-a0df0bd8a893
我现在的问题是,当我点击选中一个checkbox的时候,就卡住了,别的checkbox不能选。

大哥,你就不会传到CSDN啊

现在不在家里,上传到iteye两天每一个人来看,很郁闷。回去,我在上传下。不过这个路径就是我上传到iteye的。
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,