динамически установленные флажки сбрасываются при прокрутке - PullRequest
0 голосов
/ 11 июня 2018

У меня есть представление списка с адаптером, где я создаю несколько флажков, в адаптер я добавляю прослушиватель при изменении, чтобы изменить значение в моей базе данных области.Чуть выше этого я получаю текущие значения, хранящиеся в базе данных, чтобы сохранить прежние значения.

Кажется, это работает довольно хорошо, но когда вы прокручиваете проверенные элементы, они не проверяются после выхода за экран.

Как видно здесь:

enter image description here enter image description here

Код, который генерирует это:

Adaptor.java

if(check != null){
    viewHolder.checkbox.setText(check.title);

    if (check.completed == 1) {
        viewHolder.checkbox.setChecked(true);
    } else {
        viewHolder.checkbox.setChecked(false);
    }

    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {
                check.setCompleted();
            } else {
                check.setNotCompleted();
            }
        }
    });
}

Fragment.java

final ChecksAdaptor checksAdaptor = new ChecksAdaptor(device.checks(), getContext());

listView.setAdapter(checksAdaptor);

Полный адаптер

public class ChecksAdaptor extends ArrayAdapter<DeviceCheck> {

    public RealmResults<DeviceCheck> checks;

    Context mContext;

    // View lookup cache
    private static class ViewHolder {
        CheckBox checkbox;
    }

    public ChecksAdaptor(RealmResults<DeviceCheck> checks, Context context) {
        super(context, R.layout.check_row_item, checks);
        this.checks = checks;
        this.mContext=context;
    }

    private int lastPosition = -1;

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

        // Get the data item for this position
        final DeviceCheck check = getItem(position);

        // Check if an existing view is being reused, otherwise inflate the view
        ViewHolder viewHolder; // view lookup cache stored in tag

        final View result;

        if (convertView == null) {

            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.check_row_item, parent, false);
            viewHolder.checkbox = convertView.findViewById(R.id.checkbox);

            result=convertView;

            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result=convertView;
        }

        lastPosition = position;

        if(check != null){
            viewHolder.checkbox.setText(check.title);

            if (check.completed == 1) {
                viewHolder.checkbox.setChecked(true);
            } else {
                viewHolder.checkbox.setChecked(false);
            }

            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if (isChecked) {
                        check.setCompleted();
                    } else {
                        check.setNotCompleted();
                    }
                }
            });
        }

        // Return the completed view to render on screen
        return convertView;
    }
}

1 Ответ

0 голосов
/ 11 июня 2018

По предложению мТак

viewHolder.checkbox.setOnCheckedChangeListener(null)
...