各位好心的大哥大姐们快帮帮我吧,小妹我调了一天一宿也没弄好,谁知道这是什么问题啊。自定义了一个listview,每个item上有个button,默认button是添加按钮,当点击的时候,变成删除按钮,每次在onclick更换图片的时候,总是改变最后一条的图片,请问这是什么原因。

解决方案 »

  1.   

    代码
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    if(convertView == null){
    holder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.poi_search_in_city_item, null);
    holder.img = (ImageView)convertView.findViewById(R.id.img_id);
    holder.name = (TextView)convertView.findViewById(R.id.city_poi_name);
    holder.address = (TextView)convertView.findViewById(R.id.city_poi_address);

    holder.btn = (Button)convertView.findViewById(R.id.add);

    convertView.setTag(holder);
    }else{
    holder = (ViewHolder)convertView.getTag();
    }

    holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
    holder.name.setText((String)mData.get(position).get("name"));
    holder.address.setText((String)mData.get(position).get("address"));
    holder.btn.setBackgroundResource((Integer)mData.get(position).get("add"));


    holder.btn.setId(position);

    holder.btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub

    if(isAdd){
    holder.btn.setBackgroundResource((Integer)mData.get(position).get("delete"));
    }else{

    holder.btn.setBackgroundResource((Integer)mData.get(position).get("add"));
    }

    flag = !flag;

    }

    });


    return convertView;
    }
      

  2.   

    isAdd是哪里的,这样做是不行的。你得保存每个item下的状态
      

  3.   

    isAdd是一个变量,是个boolean值,用来控制添加还是删除的状态,从而控制更换添加还是删除按钮,
    就是下面的flag 刚写错了 
      

  4.   

    把onClick事件的代码中的holder.btn改成直接操作参数v试一下:
    @Override
    public void onClick( View v) {
    // TODO Auto-generated method stubif(isAdd){
    holder.btn.setBackgroundResource((Integer)mData.get(position).get("delete"));
    }else{holder.btn.setBackgroundResource((Integer)mData.get(position).get("add"));
    }flag = !flag;}
      

  5.   

     你要记下每个Item的状态,用一个HashMap保存每一个Item的postion和Flag .
      

  6.   

    你定义个数组把每个item的按钮状态保存起来,判断的时候
    if(isAdd[position]){
    holder.btn.setBackgroundResource((Integer)mData.get(position).get("delete"));
    }else{holder.btn.setBackgroundResource((Integer)mData.get(position).get("add"));
    }isAdd[position] = !isAdd[position];
      

  7.   

    holder.cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){   
                    @Override   
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {   
                        if(isChecked){   
                            isCheckedMap.put(id,true);   
                        }else{   
                            isCheckedMap.put(id,false);   
                        }   
                    }   
                });
                holder.cBox.setChecked(isCheckedMap.get(id));
      

  8.   

     你根据自己的逻辑,添加上自己的Flag和postion,然后holder.btn.setBackgroundResource((Integer)mData.get(position).get("add"));
     里面的值用你保存起来的HashMap 的值 ,写的比较潦草 .
      这个与ListView的缓存机制有关。当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图,如果有就用缓存中的,不过就是更新了一下绑定的数据