ListView 数据在滚动时被清除 [英] ListView Data got cleared on scrolling

查看:32
本文介绍了ListView 数据在滚动时被清除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个应用程序,它显示带有 checkBoxeslistView.当我滚动 listView 时,CheckBoxes 的值被清除了.

I am working on a application which shows listView with checkBoxes. When I scroll the listView the Value of CheckBoxes got Cleared.

下面是我的代码

适配器类:

public class Conference_listViewAdapter extends BaseAdapter {
    Activity context;
    LayoutInflater inflater;
    public static List<Model> data = null;
    ArrayList<String> id_list = new ArrayList<String>();
    ViewHolder holder;
    int pos;

    public Conference_listViewAdapter(Activity context,List<Model> list, ArrayList<String> id_list) {
        data = list;
        this.id_list = id_list;     
        this.context = context;
    }


    @Override
    public int getCount() {
        return data.size();
    }


    @Override
    public Object getItem(int position) {
        return data.get(position).getName();
    }

    @Override
    public long getItemId(int position) {
        return Long.valueOf(id_list.get(position));
    }

    public View getView(final int position, View convertView, ViewGroup parent) {

        View view = null;

        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.people_list_item1, null);
            holder = new ViewHolder();
            holder.title = (TextView) view.findViewById(R.id.tv_name);
            holder.image = (ImageView) view.findViewById(R.id.avtaar);
            holder.favorite = (CheckBox) view.findViewById(R.id.fav);
            holder.favorite.setTag(position);
            view.setTag(holder);

            holder.favorite.setTag(data.get(position));
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).favorite.setTag(data.get(position));
        }


        holder.favorite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                Model element = (Model) holder.favorite.getTag();
                element.setSelected(buttonView.isChecked());     
                //notifyDataSetChanged();
            }
        });


        ViewHolder holder = (ViewHolder) view.getTag();

        holder.favorite.setChecked(data.get(position).isSelected());
        holder.title.setText(data.get(position).getName());



        try {
            holder.image.setImageBitmap(openPhoto(Long.valueOf(id_list.get(position))));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return view;
    }

    class ViewHolder {
        TextView title;
        TextView model;
        ImageView image;
        CheckBox favorite;
    }


}

数据模型类

public class Model {

    private String name;
    private boolean selected;

    public Model(String name) {
        this.name = name;
        selected = false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

} 

不知道我哪里做错了.

推荐答案

你必须保存 ViewHolder 的状态.然后在convertView == null时设置tag,在else条件下获取.

You have to save the state of the ViewHolder. Then set the tag when convertView == null and get it in the else condition.

检查我的做法:

public class Conference_listViewAdapter extends ArrayAdapter<Model> {
    Activity context;
    LayoutInflater inflater;
    public static List<Model> data = null;
    ArrayList<String> id_list = new ArrayList<String>();

    int pos;


    public Conference_listViewAdapter(Activity context, List<Model> list, ArrayList<String> id_list) {
        super(context, R.layout.people_list_item1, list);
        this.context = context;
        this.data = list;
        this.id_list = id_list; 
    }



    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;       
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.people_list_item1, null);
            final ViewHolder holder = new ViewHolder();
            holder.title = (TextView) view.findViewById(R.id.tv_name);
            holder.image = (ImageView) view.findViewById(R.id.avtaar);
            holder.favorite = (CheckBox) view.findViewById(R.id.fav);

            view.setTag(holder);

            holder.favorite.setTag(data.get(position));

            holder.favorite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                    Model element = (Model) holder.favorite.getTag();
                    element.setSelected(buttonView.isChecked());     
                }
            });


        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).favorite.setTag(data.get(position));
        }





        ViewHolder holder = (ViewHolder) view.getTag();     
        holder.favorite.setChecked(data.get(position).isSelected());
        holder.title.setText(data.get(position).getName());

        try {
            holder.image.setImageBitmap(openPhoto(Long.valueOf(id_list.get(position))));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return view;
    }




    static class ViewHolder {
        protected TextView title;
        protected CheckBox favorite;
        ImageView image;
    }

这篇关于ListView 数据在滚动时被清除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆