CheckedTextView с ListView

У меня есть список, элементы которого являются CheckedTextViews с флажками. Однако всякий раз, когда я проверяю один и прокручиваю список, и они скрываются, когда я возвращаюсь к ним, повторно прокручивая их, они больше не проверяются! Я читал в Интернете, что списки, когда они прокручиваются, каким-то образом скрытые элементы перерабатываются (возвращаются в состояние по умолчанию, если я прав) после того, как вы прокручиваете их обратно. Я также читал, что в пользовательском адаптере я должен использовать метод под названием «setOnCheckedChangeListener», но у checkedTextViews нет этого конкретного метода! Поэтому я думаю, что моя проблема может быть связана со списками. Как я могу это решить? Спасибо.

ОБНОВЛЕНИЕ: Итак, это мой пользовательский адаптер и класс модели.

public CustomAdapter(Context c, Model[] resource) {
    super(c, R.layout.list_item, resource);

    this.context = c;
    this.modelItems = resource;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    convertView = inflater.inflate(R.layout.list_item, parent, false);
    cb = (CheckedTextView) convertView.findViewById(R.id.checkBox1);
    pN = (TextView) convertView.findViewById(R.id.numberId);
    pN.setText(modelItems[position].getPhoneNumber());
    cb.setText(modelItems[position].getName());

    return convertView;
}

Это класс модели:

  public Model(String name, String phoneNumber, int value) {
    this.name = name;
    this.value = value;
    this.phoneNumber = phoneNumber;
}

public String getName() {
    return this.name;
}

public int getValue() {
    return this.value;
}

public String getPhoneNumber() {
    return this.phoneNumber;
}

person user3882221    schedule 27.04.2016    source источник
comment
Возможный дубликат флажка не установлен, когда я прокручиваю список в Android   -  person Devendra Singh    schedule 27.04.2016
comment
какой адаптер вы используете?, вы передаете массив со значениями?   -  person Akariuz    schedule 27.04.2016
comment
Я использую собственный адаптер, и да, я передаю массив со значениями.   -  person user3882221    schedule 27.04.2016
comment
проверьте мой ответ ниже, вам нужно передать массив объекта FormCheck (или имя, которое вы хотите) вашему адаптеру.   -  person Akariuz    schedule 27.04.2016


Ответы (2)


Вы можете сохранить состояние флажка в своем адаптере, используя прослушиватель onCheckedChanged. Затем, когда вы создаете свои viewHolder, установите проверенное состояние флажка, используя данные из вашего адаптера. Надеюсь, поможет!

person Saulo R.    schedule 27.04.2016
comment
Затем вы можете реализовать onClickListener и там вы можете узнать, проверено ли представление или нет. Вы можете использовать ((CheckedTextView) v).isChecked() - person Saulo R.; 27.04.2016
comment
Я пробовал, но столкнулся с другой проблемой. Когда я реализую onClickListener, я не могу установить положение флажка, потому что я должен объявить его окончательным в параметре. Если я объявлю его окончательным, он больше не изменит значение... поэтому в основном я не могу проверить или снять отметку с других CheckedTextViews. - person user3882221; 27.04.2016

Вам нужно использовать объект, который в качестве значения флажка, например

public class FormCheck {

    private String name;
    private boolean isChecked;

    public String getName() {
        return name;
    }

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

    public boolean isChecked() {
        return isChecked;
    }

    public void setIsChecked(boolean isChecked) {
        this.isChecked = isChecked;
    }

}

и в getView() вы делаете что-то вроде этого:

checkedTextView.setChecked(itemArray.get(position).getIsChecked);

    checkedTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (checkedTextView.isChecked())
                itemArray.get(position).setIsChecked = true;
            else
                itemArray.get(position).setIsChecked = false;
        }
    });
person Akariuz    schedule 27.04.2016
comment
CheckedTextView не имеет метода onCheckedChangeListener(), он есть только у CheckBox! - person user3882221; 27.04.2016
comment
в вашем пользовательском представлении у вас нет CheckBox? - person Akariuz; 27.04.2016
comment
В моем пользовательском представлении используется только один CheckedTextView. В любом случае, вы можете объяснить мне, почему вы создаете класс FormCheck, потому что я его не понимаю. - person user3882221; 27.04.2016
comment
ListView перерабатывает представления при прокрутке, поэтому состояние представления может измениться, в getView вы должны дать представлению состояние, которое вы хотите для отображаемого объекта, а использование массива объектов и - это способ сохранить это состояние. Независимо от прокрутки - person Akariuz; 27.04.2016
comment
android.amberfog.com/wp-content/uploads/2010/ 02/ это изображение очень хорошо объясняет - person Akariuz; 27.04.2016
comment
Я до сих пор не понимаю, как вам удается решить эту проблему. Я знаю, почему это происходит, но я не получаю getIsChecked и какую роль играет класс checkform. Могу ли я как-нибудь связаться с вами в другой социальной сети, такой как facebook, или просто по электронной почте, пожалуйста? - person user3882221; 27.04.2016