Флажок Android в списке автоматически выбирается

в моем приложении для Android я показываю список контактов телефона в виде списка и флажок в каждой строке для выбора контактов. Но когда я выбираю конкретную строку, около десятой строки также выбирается автоматически. Я даю свой код ниже, если кто-нибудь знает, пожалуйста, помогите..

public class ContactsAdapter extends BaseAdapter
{
    private Context context;
    private ArrayList<Contact> contacts;


    public ContactsAdapter(Context context, ArrayList<Contact> contacts)
    {
        this.context = context;
        this.contacts = contacts;
    }

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

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;
        final ViewHolder mHolder;
        if (convertView == null)
        {

            // gridView = new View(context);
            // get layout from mobile.xml
            //gridView = inflater.inflate(R.layout.contact, null);
            convertView = inflater.inflate(R.layout.contact, null);
            mHolder = new ViewHolder();

            mHolder.textName     =(TextView) convertView.findViewById(R.id.name);
            mHolder.textMobile   =(TextView) convertView.findViewById(R.id.mobile);
            mHolder.textSelector =(CheckBox) convertView.findViewById(R.id.selected);

            convertView.setTag(mHolder);


));
            }



        else
        {


            mHolder = (ViewHolder) convertView.getTag();
            mHolder.textSelector.setOnCheckedChangeListener(null);
        }

        mHolder.textMobile.setText(contacts.get(position).getMobile());
        mHolder.textName.setText(contacts.get(position).getName());
        mHolder.textSelector.setFocusable(false);


        return convertView;
    }




    private class ViewHolder {
        private TextView textMobile,textName;
        private CheckBox textSelector;


    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

}

person Jocheved    schedule 22.09.2015    source источник
comment
проверьте этот stackoverflow.com/questions /18162931/ если поможет   -  person Raghunandan    schedule 22.09.2015


Ответы (2)


@ Jocheved... отредактируй свой код так...

public class ContactsAdapter extends BaseAdapter
{
    private Context context;
    private ArrayList<Contact> contacts;
    SparseBooleanArray sba=new SparseBooleanArray();

    public ContactsAdapter(Context context, ArrayList<Contact> contacts)
    {
        this.context = context;
        this.contacts = contacts;
    }

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

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        final ViewHolder mHolder;

        if (convertView == null)
        {
            convertView = inflater.inflate(R.layout.contact, null);
            mHolder = new ViewHolder();

            mHolder.textName     =(TextView) convertView.findViewById(R.id.name);
            mHolder.textMobile   =(TextView) convertView.findViewById(R.id.mobile);
            mHolder.textSelector =(CheckBox) convertView.findViewById(R.id.selected); 

            convertView.setTag(mHolder);   

            } 
        else
        {
            mHolder = (ViewHolder) convertView.getTag();
        }

        mHolder.textMobile.setText(contacts.get(position).getMobile());
        mHolder.textName.setText(contacts.get(position).getName());
        mHolder.textName.setSelected(true);
        mHolder.textSelector.setChecked(sba.get(position));

        mHolder.textSelector.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {

                 if(mHolder.textSelector.isChecked())
                 {
                     sba.put(position, true);
                 }

                else
                {
                    sba.put(position, false);
                }

            }
        });

        return convertView;
    }

    private class ViewHolder 
{
        private TextView textMobile,textName;
        private CheckBox textSelector;


    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

}
person roshanpeter    schedule 23.09.2015

Ну, это потому, что ViewHolder будет перерабатывать представления каждый раз, когда вы прокручиваете, я предлагаю вам вместо этого установить флажок Использовать onClick для ListItem

Чтобы решить эту проблему, объявите SparseBooleanArray

SparseBooleanArray sba=new SparseBooleanArray();//this should be global

Затем установите для элементов отмеченное состояние, как только вы его визуализируете

 mHolder.textSelector =(CheckBox) convertView.findViewById(R.id.selected);
 mHolder.textSelector.setChecked(sba.get(position));

Затем напишите onClickListener для convertView и проверьте его вручную

 convertView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
            mHolder.textSelector.setChecked(isChecked);
            sba.put(position,isChecked); //storing the state
           }
       }

);  

   **Well Now the sba has list items checked and you can use that for further Actions**
person Rajan Kali    schedule 22.09.2015
comment
Я получаю сообщение об ошибке «Ожидаемый тип массива найден массив andoid.util.sparseboolean, - person Jocheved; 22.09.2015