学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里就不会放多少文件引用,不可能会导致现在程序里的卡。实在是想不出哪里出的问题,希望高手能解答下。不胜感激啊。
如果有啥问题,可以邮箱告诉我,一定会回的。邮箱地址:[email protected]
下面附上些的完整代码程序。http://dl.iteye.com/topics/download/6c04731e-6156-3477-8c74-a0df0bd8a893

解决方案 »

  1.   

    源代码看不了啊我没法去运行,但是感觉,你把holder.checkbox.setOnClickListener放在if(map.get(position)   ==   null){}里边不太合适吧?应该放在 if  -- else 之后吧?
      

  2.   

    我也做过类似的,我的处理方法是
    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());
    }
    };
    我不知道这符合不符合你的要求,反正我是实现了选中就勾住,再点一次就取消选中
    给你参考吧
      

  3.   

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

  4.   

    我这个是做的一个文件管理器,我估计这样不行,因为,我点击一个文件的View的时候,是要进入到这个目录去的。而不是选中checkbox。我的想法只是点击了checkbox才选中,然后实现多文件操作
      

  5.   

    现在不在家里,上传到iteye两天每一个人来看,很郁闷。回去,我在上传下。不过这个路径就是我上传到iteye的。