【问题标题】:Retain the number of Listview item's checked while scrolling保留滚动时检查的 Listview 项目的数量
【发布时间】:2014-08-21 08:34:07
【问题描述】:

我在 Listview 中有联系人列表,每个联系人都有复选框。我想将选中的联系人数量限制为 5。在遵循此 link 之后,我设法保留了复选框的状态,但无法保留联系人的数量检查。

这是我迄今为止尝试过的:

  public View getView(final int position, View convertView, ViewGroup parent) {
        final Holder holder;
        Bitmap bitmap = null;

        if(convertView == null)
        {
            holder = new Holder();

            convertView = layoutInflater.inflate(R.layout.fetch_single_contact, null);
            holder.name = (TextView) convertView.findViewById(R.id.sc_name);
            holder.number = (TextView) convertView.findViewById(R.id.sc_number);

            holder.name.setTypeface(mTypeface);
            holder.number.setTypeface(mTypeface);

            holder.select = (CheckBox)convertView.findViewById(R.id.contact_checkbox_btn);

            holder.contact_img = (ImageView)convertView.findViewById(R.id.contact_img);

            holder.select.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
                {
                    int getPosition = (Integer)buttonView.getTag();

                    contactsList.get(getPosition).setSelected(buttonView.isChecked());

                    if(isChecked)
                    {
                        total_contacts_selected ++;
                    }
                    else if(!isChecked)
                    {
                        total_contacts_selected--;
                    }
                    if(total_contacts_selected > 5)
                    {
                        Log.i("ContactsAdapter", "5 Contacts already selected");

                    Toast.makeText(getApplicationContext(), "5 Contacts already selected", Toast.LENGTH_LONG).show();
                        buttonView.setChecked(false);
                        total_contacts_selected--;
                    }
                    else
                    {
                contactsList.get(getPosition).setSelected(buttonView.isChecked());
                    }

                }
            });

            convertView.setTag(holder);
            convertView.setTag(R.id.sc_name, holder.name);
            convertView.setTag(R.id.contact_checkbox_btn, holder.select);

        }

        else{
            holder = (Holder) convertView.getTag();
        }

        holder.name.setText(contactsList.get(position).getName());
        holder.number.setText(contactsList.get(position).getNumber());
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(contactsList.get(position).getImgUri()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        holder.contact_img.setImageBitmap(getRoundedCornerBitmap(bitmap, 100));
        holder.select.setTag(position);
        holder.select.setChecked(contactsList.get(position).isSelected());
        return convertView;
    }

【问题讨论】:

    标签: android listview checkbox android-listview


    【解决方案1】:

    当您调用holder.select.setChecked() 时,计数器会更新。基本上每次调用 getView() 时都会弄乱计数器。最简单的解决方案是在 getView() 中设置检查状态之前删除侦听器,然后将其放回原处。您可以将其保存为成员以避免每次都重新创建新的侦听器。

    【讨论】:

    • 我没有完全理解你的意思??当持有者仅在 getview 中初始化时,如何将其保存为 getview 之外的成员
    • 一个简单的方法是让监听器作为视图 יolder 的成员。当您第一次创建持有者时,请初始化侦听器。然后在需要时从复选框中设置和删除它。
    【解决方案2】:

    改变 onCheckedChanged 方法如下。如果先前和当前状态相同,则应忽略检查更改事件。

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int getPosition = (Integer) buttonView.getTag();
            boolean isSelected = contactsList.get(getPosition).isSelected();
            if (isSelected == isChecked) {
                // Current state is same as previous one. Ignore.
                return;
            }
            if (isChecked) {
                total_contacts_selected++;
            } else if (isChecked == false) {
                total_contacts_selected--;
            }
            if (total_contacts_selected > 5) {
                Log.i("ContactsAdapter", "5 Contacts already selected");
                Toast.makeText(getApplicationContext(),
                        "5 Contacts already selected", Toast.LENGTH_LONG).show();
                // When we call below method, onCheckChanged will be invoked again.
                // First if case in will make sure that un-necessary code will not
                // be executed.
                buttonView.setChecked(false);
                total_contacts_selected--;
            } else {
                contactsList.get(getPosition).setSelected(isChecked);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多