急啊!!!andriod里自定义listview 各位好心的大哥大姐们快帮帮我吧,小妹我调了一天一宿也没弄好,谁知道这是什么问题啊。自定义了一个listview,每个item上有个button,默认button是添加按钮,当点击的时候,变成删除按钮,每次在onclick更换图片的时候,总是改变最后一条的图片,请问这是什么原因。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码@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; } isAdd是哪里的,这样做是不行的。你得保存每个item下的状态 isAdd是一个变量,是个boolean值,用来控制添加还是删除的状态,从而控制更换添加还是删除按钮,就是下面的flag 刚写错了 把onClick事件的代码中的holder.btn改成直接操作参数v试一下:@Overridepublic 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;} 你要记下每个Item的状态,用一个HashMap保存每一个Item的postion和Flag . 你定义个数组把每个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]; 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)); 你根据自己的逻辑,添加上自己的Flag和postion,然后holder.btn.setBackgroundResource((Integer)mData.get(position).get("add")); 里面的值用你保存起来的HashMap 的值 ,写的比较潦草 . 这个与ListView的缓存机制有关。当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图,如果有就用缓存中的,不过就是更新了一下绑定的数据 DatePicker问题,求指点 有没有android里面画一个钟表盘的sample code啊 初学android,先请教一下安卓中播放rtsp流媒体机制 android出现错误,求指导!! 想问个应用内置收费的问题 android 按钮点击事件中拿不到static对象的值 没有com.google.android.maps包,咋办啊? 菜鸟求助!!!!怎么固定ListView大小!!!!!!! bitmapfun 使用出现问题 如何在自己程序中集成google play service 带tabhost的右推效果怎么实现 请问如何在被跳转的activity里判断上一个activity呢?
@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;
}
就是下面的flag 刚写错了
@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;}
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];
@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));
里面的值用你保存起来的HashMap 的值 ,写的比较潦草 .
这个与ListView的缓存机制有关。当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图,如果有就用缓存中的,不过就是更新了一下绑定的数据