首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表视图在删除带有复选框值= true的行后不会刷新值。

列表视图在删除带有复选框值= true的行后不会刷新值。
EN

Stack Overflow用户
提问于 2017-10-06 19:35:05
回答 1查看 38关注 0票数 0

日安,

我正在做一个listview,带有复选框的able适配器,它可以删除多个选定的行。

这是我的onCreate:

代码语言:javascript
复制
 ArrayList<Memos> list;

 list = new ArrayList<Memos>();
 list.add(new Memos(1, "s", "s"));
 list.add(new Memos(2, "x", "aaa"));
 list.add(new Memos(3, "v", "aesf"));

 final ListView lv = (ListView) findViewById(R.id.myList);
 lv.setAdapter(new MemoListAdapter(list, this));

 deletebutton
 @Override
      public void onClick(View v) {
           MemoListAdapter myAdapter = (MemoListAdapter)lv.getAdapter();  
           myAdapter.remove();
      }

下面是我的完整基适配器:

代码语言:javascript
复制
        public class MemoListAdapter extends BaseAdapter {
    private List<Memos> listComment;
    private Context context;
    private LayoutInflater inflater = null;
    private ArrayList<Memos> deleteMemos;

    public MemoListAdapter(List<Memos> listComment, Context context) {
        super();
        this.listComment = listComment;
        this.context = context;
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        deleteMemos = new ArrayList<Memos>();
    }

    @Override
    public int getCount() {

        return listComment.size();
    }

    @Override
    public Memos getItem(int position) {
        return listComment.get(position);
    }

    @Override
    public long getItemId(int arg0) {
        return 0;
    }

    @Override
    public int getViewTypeCount() {

     return getCount();
    }

    @Override
    public int getItemViewType(int position) {

     return position;
    }

    public class ViewHolder
    {
        TextView body;
        TextView date;
        CheckBox checkBox;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {   
        final ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_view, null);
            holder = new ViewHolder();
            holder.body = (TextView) convertView.findViewById(R.id.big_text);
            holder.date = (TextView) convertView.findViewById(R.id.small_text);
            holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
            holder.body.setText(listComment.get(position).getMessageBody());
            holder.date.setText(listComment.get(position).getMessageDate());

            holder.checkBox.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                          //is chkIos checked?
                    if(listComment.get(position).isCheckbox()) {
                     holder.checkBox.setChecked(false);
                     deleteMemos.remove(listComment.get(position));
                    }
                    else {
                        // Do invisible or gone stuff here
                     holder.checkBox.setChecked(true);
                     deleteMemos.add(listComment.get(position));
                    }

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

    public void remove() {

        for(Memos memo : deleteMemos) {
            listComment.remove(memo);
        }
        this.notifyDataSetChanged();
    }
    }

选择要删除的行(4行)

列表已调整,但复选框的内容和复选值仍然相同。

我想知道notifyDataSetChanged的哪一部分是错误的。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-06 19:49:09

你的观点被重复使用,这就是它发生的原因。尝试将以下代码添加到getView()中

代码语言:javascript
复制
 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_view, null);
            holder = new ViewHolder();
            holder.body = (TextView) convertView.findViewById(R.id.big_text);
            holder.date = (TextView) convertView.findViewById(R.id.small_text);
            holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);

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

        if(listComment.get(position).isCheckbox()) {
            holder.checkBox.setChecked(true);
        }else {
            holder.checkBox.setChecked(false);
        }

        holder.body.setText(listComment.get(position).getMessageBody());


        holder.date.setText(listComment.get(position).getMessageDate());
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)  {
                listComment.get(position).setIsCheckbox(isChecked);
                if (isChecked){
                    deleteMemos.add(listComment.get(position));
                }else{
                    deleteMemos.remove(listComment.get(position));
                }
            }

        });

        return convertView;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46612796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档