Android 如何更改自定义游标适配器以在listview中仅显示给定片段的特定行?

Android 如何更改自定义游标适配器以在listview中仅显示给定片段的特定行?,android,android-fragments,android-cursoradapter,Android,Android Fragments,Android Cursoradapter,我的应用程序中的三个片段Fragment1、Fragment2、Fragment3使用单个自定义CursorAdapter类TaskCursorAdapter在listview中显示单个表的内容。下面是课堂: public class TaskCursorAdapter extends CursorAdapter { public TaskCursorAdapter(Context context, Cursor c) { super(context, c, 0 /* f

我的应用程序中的三个片段Fragment1、Fragment2、Fragment3使用单个自定义CursorAdapter类TaskCursorAdapter在listview中显示单个表的内容。下面是课堂:

public class TaskCursorAdapter extends CursorAdapter {
    public TaskCursorAdapter(Context context, Cursor c) {
        super(context, c, 0 /* flags */);
    }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.list_item_task, parent, false);
    }
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView titleTextView = (TextView) view.findViewById(R.id.task_title);
        TextView detailsTextView = (TextView) view.findViewById(R.id.task_details);
        int titleColumnIndex = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE);
        int detailsColumnIndex = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DETAILS);
        String taskTitle = cursor.getString(titleColumnIndex);
        String taskDetails = cursor.getString(detailsColumnIndex);
        if (TextUtils.isEmpty(taskDetails)) {
            taskDetails = context.getString(R.string.unknown_task);
        }
        titleTextView.setText(taskTitle);
        detailsTextView.setText(taskDetails);
    }
}
该表在合同类中指定为TaskEntry。它还有一个名为TaskEntry的列。column\u TASK\u STATUS=“STATUS”。可能的值为0、1或2。目前,所有项目都显示在两个片段中。但是,我想让它只在Fragment1中显示状态为0的行,在Fragment2中显示状态为1的行,在Fragment3中显示状态为2的行

我在bindView方法中尝试了以下操作:

int taskStatus = Integer.parseInt(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_STATUS)));
if(taskStatus==0) { //code in bindView }
这导致在所有片段中仅显示状态为0的项,但留下了一个空的膨胀视图来代替状态为0以外的项。 此外,我无法找到一种方法来传递信息,使其特定于Fragment1

我应该如何根据状态值和片段有条件地显示行

编辑: 工作原理:

我没有在TaskCursorAdapter中尝试这一点,而是在onCreateLoader方法中使用了条件查询,如下所示:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String selectionArgs[] = {"<status>"};
    String[] projection = {
            TaskEntry._ID,
            TaskEntry.COLUMN_TASK_TITLE,
            TaskEntry.COLUMN_TASK_DETAILS};
    return new CursorLoader(this.getActivity(), TaskEntry.CONTENT_URI, projection,
            TaskEntry.COLUMN_TASK_STATUS + " = ?", selectionArgs, null);
}
public Loader onCreateLoader(int-id,Bundle-args){
字符串selectionArgs[]={”“};
字符串[]投影={
任务条目。\u ID,
TaskEntry.COLUMN_TASK_TITLE,
TaskEntry.COLUMN_TASK_DETAILS};
返回新的游标装入器(this.getActivity()、TaskEntry.CONTENT\u URI、投影、,
TaskEntry.COLUMN_TASK_STATUS+“=?”,selectionArgs,null);
}
试试这个:

public class TaskCursorAdapter extends CursorAdapter {
    private int statusCode;        

    public TaskCursorAdapter(Context context, Cursor c) {
        super(context, c, 0 /* flags */);
    }

    public setStatusCode(int statusCode){
        this.statusCode = statusCode;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        int currentStatusCode = Integer.parseInt(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_STATUS)));
        if(statusCode == currentStatusCode){
            return LayoutInflater.from(context).inflate(R.layout.list_item_task, parent, false);
         } else return null;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        if(view != null){
            TextView titleTextView = (TextView) view.findViewById(R.id.task_title);
            TextView detailsTextView = (TextView) view.findViewById(R.id.task_details);
            int titleColumnIndex = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE);
            int detailsColumnIndex = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DETAILS);
            String taskTitle = cursor.getString(titleColumnIndex);
            String taskDetails = cursor.getString(detailsColumnIndex);
            if (TextUtils.isEmpty(taskDetails)) {
                taskDetails = context.getString(R.string.unknown_task);
            }
            titleTextView.setText(taskTitle);
            detailsTextView.setText(taskDetails);
        }
    }
}
在每个片段中执行此操作,分别传递状态代码:

 yourAdapter = new TaskCursorAdapter(this, yourDataCursor);
 yourAdapter.setStatusCode(YOUR_STATUS_CODE);
 yourListView.setAdapter(yourAdapter);
EDIT(事实证明我们不能从CursorAdapter#newView()返回null)


因此,我想在实例化新的TaskCursorAdapter之前,您必须在每个片段中过滤光标,并传入过滤后的光标而不是原始光标。您可以使用CursorWrapper类来实现此目的。这个答案可能会让您产生一个想法:。

我尝试了这个方法,结果是应用程序一运行就终止了首先,出现以下异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.view.view.GetImportEntForAccessibility()”,添加条件(view!=null)对于从newView方法返回null没有帮助。但是在bindView中测试statusCode会导致不必要的视图膨胀。我明白了。所以我认为您应该为每个片段使用不同的游标。为此,我建议使用filt逻辑实现游标包装器,而不是每次查询数据库根据它们的状态代码修改结果,并使用它来代替原来的游标。好吧,我对使用不同的游标犹豫不决,不知道这是效率低下还是总体上不好。谢谢,如果没有解决方法,我会同意你的建议,使用不同的游标。只要确保你不查询数据库即可每次,因为这将非常昂贵。取而代之的是,获取一次光标,然后使用CursorWrapper筛选行。您可能需要编写自己的自定义CursorWrapper以获得所需的功能:)