Список с настраиваемыми проверяемыми строками, поддерживаемыми пользовательским адаптером курсора, теряет выбор при повторном использовании представлений.

Я знаю, что этот вопрос задавался раньше, но у меня есть мнение, для которого я просто не могу найти элегантного решения.

Как я могу отслеживать выбранные флажки в списке, который использует настраиваемый относительный макет с возможностью проверки (который имеет флажок и другие текстовые представления), поддерживаемый настраиваемым адаптером курсора, который может изменять размер в зависимости от того, что щелкает пользователь (он фильтрует пользователей выбор).

У меня есть активность listview, в которой используется настраиваемый адаптер курсора (с соответствующими переопределениями для функций bindview и newview вместе с классом viewHolder, чтобы воспользоваться преимуществом повторного использования представления).

Когда пользователь щелкает элемент строки, список фильтруется, и диспетчер загрузки перезапускается для отображения нового отфильтрованного списка. Это означает, что размер моего списка постоянно меняется. Кроме того, я попытался реализовать всю функцию переопределения флажка onclicklistener вместе с настройкой и получением тегов, но независимо от того, что я делаю в своем методе bindview(), флажки не проверяются (может быть, это потому, что они находятся в проверяемой строке) . Кроме того, я действительно запутался со всем переопределением флажка onclicklistener в getview (или методом bindview в моем случае), а также с тем фактом, что многие решения, которые я видел, не имеют списков, которые постоянно меняют размер.

Любая помощь будет принята с благодарностью.

Вот мой собственный класс адаптера курсора.

    public class TaskListViewAdapter extends CursorAdapter {

    private LayoutInflater mLayoutInflater;

    public TaskListViewAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);

        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder holder = (ViewHolder) view.getTag();
        int nTaskStatus;
        int nTaskType;
        int nSuite;
        String nTaskServiceTextColor;
        String nTaskServiceBackgroundColor;
        String nSuiteValue;

        if (holder == null)
        {
            // Creates a ViewHolder and store references to the children views we want to bind data to.
            holder = new ViewHolder();

            holder.taskScreenCheckBox = (CheckBox) view.findViewById(R.id.taskScreenCheckBox);
            holder.taskScreenRowText11 = (TextView) view.findViewById(R.id.taskScreenRowText11);

            view.setTag(holder);
        }

        // Getting the data from the cursor and setting the row elements appropriately
        if (cursor != null) {


            holder.taskScreenRowText11.setText(cursor.getString(cursor.getColumnIndex(DatabaseAdapter.KEY_TASKS_NUMEROAPPEL)));

        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        final View view = mLayoutInflater.inflate(R.layout.task_screen_row, parent, false);
        return view;
    }

    /**
     * 
     * 
     *         A viewholder that stores each component of the task_screen_row view.
     * 
     */
    static class ViewHolder {
        CheckBox taskScreenCheckBox;
        TextView taskScreenRowText11;

    }
}

Вот мой пользовательский макет строки Checkable:

    package com.courrierplus.mobi;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.RelativeLayout;

public class CheckableRelativeLayout extends RelativeLayout implements Checkable {

    private CheckBox mCheckbox;

    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean isChecked() {
        return mCheckbox.isChecked();
    }

    @Override
    public void setChecked(boolean isChecked) {
        mCheckbox.setChecked(isChecked);
    }

    @Override
    public void toggle() {
        mCheckbox.toggle();
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        final int childCount = this.getChildCount();
        for (int i = 0; i < childCount; ++i) {

            View v = getChildAt(i);
            if (v instanceof CheckBox) {
                mCheckbox = (CheckBox) v;
            }
        }
    }
}

В моем ListViewActivity пользователь щелкает строку, вызывается функция onListItemClick, которая затем вызывает код newView в моем пользовательском адаптере, который увеличивает мою пользовательскую проверяемую строку и проверяет флажок внутри нее.

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




Ответы (1)


Я уже сталкивался с подобной проблемой в Android. Я думаю, это может вам помочь..

Как связать флажок для каждого контакта в заполненном списке?

person Bharat Sharma    schedule 02.05.2013
comment
Спасибо! Попробую это и вернусь к вам. - person Azimoto; 30.05.2013