学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
自定义的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.将你的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());
}
};
我不知道这符合不符合你的要求,反正我是实现了选中就勾住,再点一次就取消选中
给你参考吧
我现在的问题是,当我点击选中一个checkbox的时候,就卡住了,别的checkbox不能选。