具有自定义游标适配器支持的自定义可检查行的Listview在回收视图时会丢失选择

时间:2013-05-02 03:43:13

标签: android android-listview android-cursoradapter custom-adapter android-checkbox

我知道之前已经问过这个问题,但我对它有一个旋转,我似乎无法找到一个优雅的解决方案。

如何跟踪列表视图中的所选复选框,该列表视图使用自定义光标适配器支持的自定义可检查相对布局(具有复选框和其他文本视图),可以根据用户点击的内容更改大小(它过滤关于用户选择)。

我有listview活动,它使用自定义游标适配器(具有bindview和newview函数的相应覆盖以及viewHolder类以利用视图回收)。

当用户点击行项目时,列表将被过滤,并且loadmanager将重新启动以显示新的过滤列表。这意味着我的列表视图大小不断变化。此外,我试图实现整个复选框onclicklistener覆盖事物以及设置和获取标签,但无论我在bindview()方法中做什么,复选框都不会被检查(这可能是因为它们在可检查的行内) 。另外,我对getview(或我的案例中的bindview方法)中的整个复选框onclicklistener覆盖以及我见过的很多解决方案都没有不断改变大小的列表视图这一事实感到困惑。

非常感谢任何帮助。

这是我的自定义游标适配器类。

    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;

    }
}

这是我自定义的可检查行布局:

    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 个答案:

答案 0 :(得分:1)

我已经在android中遇到过类似的问题。我想这可以帮到你..

How do I link a checkbox for every contact in populated listview?