这是我重写的getView方法:
public View getView(int position, View convertView, ViewGroup parent) {
final int p2 = position;
ViewHolder holder = null;
// 1 start
if(convertView != null){
holder = (ViewHolder)convertView.getTag();
}else{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_folder_item, null);
holder.img = (ImageView) convertView
.findViewById(R.id.list_item_img);
holder.name = (TextView) convertView
.findViewById(R.id.list_item_name);
holder.isDir = (TextView) convertView
.findViewById(R.id.list_item_isDirectory);
holder.check = (CheckBox) convertView
.findViewById(R.id.list_item_check);

convertView.setTag(holder);
}
// 1 end map = null;
map = (Map<String, Object>) lmap.get(position);

holder.img.setImageResource(Integer.parseInt(map.get("img") + ""));
holder.name.setText(map.get("name") + "");
holder.isDir.setText(map.get("isDir") + "");
if(holder.isDir.getText().equals(FileOpertion.FFILE)){
holder.name.setOnClickListener(new TextView.OnClickListener() {
public void onClick(View v) {
}
});
}

holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton bv, boolean isChecked) {
if(isSelected.get(p2)){
isSelected.put(p2, false);
selectedList.remove(lmap.get(p2));
}else{
isSelected.put(p2, true);
selectedList.add(lmap.get(p2));
}
}
});

//是文件夹,隐藏checkbox,
if (holder.isDir.getText().toString().equalsIgnoreCase(FileOpertion.DIRECTORY)) {
// 22
Log.d("1111","1111111");
holder.check.setVisibility(View.INVISIBLE);
} return convertView;
} final static class ViewHolder {
public ImageView img;
public TextView name;
public TextView isDir;
public CheckBox check;
public ViewHolder() {
}
}按以上写法,在遇到大量FFILE类型的文件时( 50+个FFILE类型文件算多吗???? ),就在当前listItem中显示checkbox;
但是在显示时出了问题,有的FFILE类型的listitem项里没有checkbox;
我以为是我程序有问题,当我重复打开这个页面时,每次打开出现问题的listItem都不同,数量也不同,而是随机的.当我把 1 位置的代码换成:
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_folder_item, null);
holder.img = (ImageView) convertView
.findViewById(R.id.list_item_img);
holder.name = (TextView) convertView
.findViewById(R.id.list_item_name);
holder.isDir = (TextView) convertView
.findViewById(R.id.list_item_isDirectory);
holder.check = (CheckBox) convertView
.findViewById(R.id.list_item_check);
convertView.setTag(holder);
就是把if去掉;就没有上面说的问题了,但是性能又受到影响...
上面两次实验, 22 位置的debug信息都没有出现,证明不是程序主动去隐藏的;现在我混乱了..这是怎么回事啊?

解决方案 »

  1.   

    没有人懂???我整理下代码:
    public View getView(int position, View convertView, ViewGroup parent) {    
        ViewHolder holder = null;    
        // 1 start    
        if(convertView != null){    
            holder = (ViewHolder)convertView.getTag();    
        }else{    
            holder = new ViewHolder();    
            convertView = mInflater.inflate(R.layout.list_folder_item, null);    
            holder.img = (ImageView) convertView    
            .findViewById(R.id.list_item_img);    
            holder.name = (TextView) convertView    
            .findViewById(R.id.list_item_name);    
            holder.check = (CheckBox) convertView    
            .findViewById(R.id.list_item_check);    
            convertView.setTag(holder);    
        }    
        // 1 end    
           
        holder.img.setImageResource(Integer.parseInt(map.get("img") + ""));    
        holder.name.setText(map.get("name") + "");    
        holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {    
            public void onCheckedChanged(CompoundButton bv, boolean isChecked) {    
                if(....){    
                ....   
                }else{    
                ....   
                }    
            }    
        });    
           
        //非FFILE类型,隐藏checkbox,    
        if (!holder.name.getText().toString().endsWith(FileOpertion.FFILE)) {    
            // 22    
            Log.d("1111","1111111");    
            holder.check.setVisibility(View.INVISIBLE);    
        }    
           
        return convertView;    
    }