CursorTreeAdapter - возвращает часть группового курсора для данных Childview. - PullRequest
1 голос
/ 24 февраля 2011

В настоящее время я использую CursorTreeAdapter для сопоставления Curser с ExpandableListView в Android.

Все работает хорошо, кроме способа обработки данных внутри ListView.Обычно все данные уже находятся внутри Курсора, который я предоставляю Конструктору CursorTreeAdater - даже даа для Childview.Проблема в том, что Android ожидает, что данные для ChildView будут получены функцией getChildrenCursor:

@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
    db.open();
    return db.getEpisode(groupCursor.getString(0));
}

Здесь вы уже видите проблему.Я должен вернуть курсор, но я не могу просто «вырезать» одну запись в Курсоре, которая отвечает за конкретное Childview.Вместо этого я придумал что-то вроде запроса к базе данных для каждого отдельного ChildView.Это не только глупо, поскольку данные уже есть (внутри группового курсора), но и довольно медленно.

Мой вопрос был бы, если есть какая-то функциональность клонирования только определенных записей курсоров или возврата толькоодна запись вместо того, чтобы постоянно запрашивать базу данных.

Может быть, я тоже отключен, используя CursorTreeAdapter и использование более общего AdapterClass было бы полезно.

Спасибо всем, Йоханнес

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Я сейчас понял это сам.

Ответ состоял в том, чтобы переключиться с CursorTreeAdapter на BaseExpandableListAdapter

Раньше я как-то испугался (не знаю почему), но теперь он работает как шарм.

Если кто-то заинтересован в коде, я могу опубликовать его здесь. Просто оставьте комментарий

0 голосов
/ 01 июня 2012

По запросу мой текущий исходный код. Возможно, потребуется некоторое очищение - но я надеюсь, что вы поняли. Пожалуйста, спросите, если у вас есть дополнительные вопросы.

public class SeriesSeasonEpisodesAdapter extends BaseExpandableListAdapter {

    LayoutInflater mInflater;
    OnClickListener cbListener;
    long date;
    Cursor c;

    public SeriesSeasonEpisodesAdapter(Cursor cursor, Context context,
                    boolean autoRequery, OnClickListener cbListener) {

            this.cbListener = cbListener;

            mInflater = (LayoutInflater) context
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public boolean hasStableIds() {
            return true;
    }

    @Override
    public boolean isChildSelectable(int arg0, int arg1) {
            return false;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
            return 1;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {

            c.moveToPosition(groupPosition);

            % FILL convertView %

            return convertView;
    }


    @Override
    public Object getChild(int groupPosition, int childPosition) {
            return getGroup(groupPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
            // TODO Auto-generated method stub
            return 0;
    }

    @Override
    public Object getGroup(int groupPosition) {
            c.moveToPosition(groupPosition);
            return c;
    }

    @Override
    public int getGroupCount() {
            if (c == null)
                    return 0;
            return c.getCount();
    }

    @Override
    public long getGroupId(int groupPosition) {
            // TODO Auto-generated method stub
            return 0;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {

            c.moveToPosition(groupPosition);

            % FILL convertView %

            return convertView;
    }

    public void swapCursor(Cursor c) {
            this.c = c;
            notifyDataSetChanged();
    }

}
...