如何在Android中的ListView中处理视图回收

时间:2014-07-21 09:31:11

标签: android listview

在我的应用中,我使用的自定义ListView包含ImageViewTextView,按钮和CheckBox。问题是,如果我检查列表项0,项目5&还选择了9。我已经阅读了this文章并尝试实施该系统,但无济于事。以下是我正在使用的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    view = convertView;
    item=items.get(position);
    if (view == null) {
        view = inflater.inflate(R.layout.layout_marine, parent, false);
        holder = new ViewHolder();
        holder.pic = (ImageView) view.findViewById(R.id.imageViewPic);
        holder.title = (TextView) view.findViewById(R.id.textViewTitle);
        holder.phone = (TextView) view.findViewById(R.id.textViewPhone);
        holder.address = (TextView) view.findViewById(R.id.textViewAddress);
        holder.btnFav=(CheckBox) view.findViewById(R.id.buttonFav);
        cbFav=holder.btnFav;
        holder.btnFav.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                DirectoryItem elem=(DirectoryItem) holder.btnFav.getTag();

                if(elem.isFav() && buttonView.isChecked()){// check if already added or deleted.
                    return;
                }
                if(!elem.isFav() && !buttonView.isChecked()){
                    return;
                }
                elem.setFav(buttonView.isChecked());
                if(isChecked){
                    AddToFavourites add=new AddToFavourites(context, cbFav);
                    add.execute(String.valueOf(elem.getId()));
                }else{
                    RemoveFromFavourites remove=new RemoveFromFavourites(context, cbFav);
                    remove.execute(String.valueOf(elem.getId()));
                }

            }
        });
        holder.btnFav.setTag(item);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();

    }

    loader.displayImage(item.getImgUrl(), holder.pic, options);
    holder.title.setText(item.getTitle());
    holder.phone.setText(item.getPhone());
    holder.address.setText(item.getAddress());

    holder.btnFav.setChecked(item.isFav());
    firstTime=false;
    return view;
}

我在这里遗漏了什么吗?请帮我提一下你的建议。提前谢谢。

编辑:

我改变了上面的代码,现在它显示了一个奇怪的行为。项目I检查在退出视图后不会保持检查状态。而是检查其他一些项目。我还有一个问题 - 我正在维护ArrayList DirectoryItems,其中包含一个布尔值,指定是否选择了该项。我是否可以使用它来访问CheckBox的状态,而不是将其放入标记并从那里访问它?如果不是为什么会这样,因为以这种迂回的方式做这件事似乎是非常直观的。

3 个答案:

答案 0 :(得分:0)

我认为问题是单击复选框后您的items结构没有刷新。检查item.isFav()是否填写正确

答案 1 :(得分:0)

holder.btnFav.setTag(item);在if部分中也需要放入else部分

 holder.btnFav.setTag(item);
    view.setTag(holder);
} else {
    holder = (ViewHolder) view.getTag();
    holder.btnFav.setTag(item);
}

因为复选框已被回收,标签必须刷新。

答案 2 :(得分:0)

  

你必须通过...维持列表中的复选框状态   field boolean isChecked;在项目 - > ArrayList的即可。并检查状态   ...在 getView(..)

getView(){
.......
  holder.btnFav.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            items.isChecked=isChecked;
            if(isChecked){
                ..........
            }else{
                .............
            }
        }
    });
holder.btnFav.setChecked(items.isChecked);
......
}