Как изменить пользовательский CursorAdapter для отображения только определенных строк в списке для данного фрагмента? - PullRequest
0 голосов
/ 06 октября 2018

Три фрагмента в моем приложении, Fragment1, Fragment2, Fragment3, отображают содержимое одной таблицы в виде списка, используя единственный пользовательский класс CursorAdapter, TaskCursorAdapter.Вот класс:

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_TASK_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);
}

1 Ответ

0 голосов
/ 06 октября 2018

Попробуйте:

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);

РЕДАКТИРОВАТЬ (ЭтоОказывается, мы не можем вернуть ноль из CursorAdapter # newView ()

Так что я предполагаю, что вам придется фильтровать курсор в каждом фрагменте перед созданием нового TaskCursorAdapter и передавать отфильтрованный курсор вместо вашегооригинальный курсор. Вы можете использовать класс CursorWrapper для этого. Этот ответ может дать вам представление: https://stackoverflow.com/a/7343721/8354184.

...