Android CursorLoaded с пользовательским BaseAdapter

Я искал, как это сделать, но мои выводы довольно короткие.

Я реализовал ContentProvider в своем приложении. И мои фрагменты используют обратные вызовы CursorLoader для запроса ContentProvider.

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

Мой общий вопрос: как передать результаты курсора в пользовательский BaseAdapter?

Спасибо.


person dmfrey    schedule 09.07.2012    source источник


Ответы (2)


что я бы сделал, так это создал CustomCursorAdapter, расширяющийся от CursorAdapter.

вот пример, который вы можете использовать :)

public class ContactListCustomCursorAdapter extends CursorAdapter {

private static final String TAG = ContactListCustomCursorAdapter.class.getName();
private LayoutInflater mInflater;

public ContactListCustomCursorAdapter(Context context) {
    super(context, null, false);
    mInflater = LayoutInflater.from(context);
}

В конструкторе вы можете получить layoutInflater для последующего надувания каждого представления.

@Override
public void bindView(View view, Context context, Cursor cursor) {
    contactName = cursor.getString(cursor
            .getColumnIndex(Contacts.DISPLAY_NAME));
    currentId = cursor.getLong(cursor.getColumnIndex(Contacts._ID));
    currentChar = contactName.substring(0, 1);
    ViewHolder mHolder = (ViewHolder) view.getTag();

    if (cursor.isFirst()) {
        mHolder.header.setVisibility(View.VISIBLE);
        mHolder.charHeader.setText(currentChar);
        mHolder.fistContactBackground.setVisibility(View.VISIBLE);
        mHolder.normalBackground.setVisibility(View.GONE);
    } else {
        cursor.moveToPrevious();
        previousChar = cursor.getString(
                cursor.getColumnIndex(Contacts.DISPLAY_NAME)).substring(0,
                1);
        if (collator.compare(currentChar, previousChar) != 0) {
            mHolder.header.setVisibility(View.VISIBLE);
            mHolder.charHeader.setText(currentChar);
            mHolder.fistContactBackground.setVisibility(View.VISIBLE);
            mHolder.normalBackground.setVisibility(View.GONE);
        } else {
            mHolder.header.setVisibility(View.GONE);
            mHolder.fistContactBackground.setVisibility(View.GONE);
            mHolder.normalBackground.setVisibility(View.VISIBLE);
        }
        cursor.moveToNext();
    }
}

В представлении привязки я сделал это, чтобы узнать, имеет ли строка разницу с предыдущим именем и показывает ли случай заголовок разделителя.

@Override
public Object getItem(int position) {
}

В getItem вы можете вернуть объект или то, что необходимо для внешней операции, например, щелчок по элементу списка.

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mInflater.inflate(R.layout.contact_row, parent, false);
    ViewHolder refHolder = new ViewHolder();
    refHolder.name = (TextView) view
            .findViewById(R.id.contact_row_name_textView);
    refHolder.setContactPhoto((ImageView) view
            .findViewById(R.id.contact_row_photo_ImageView));
    refHolder.header = (LinearLayout) view
            .findViewById(R.id.contact_row_separator);
    refHolder.charHeader = (TextView) view
            .findViewById(R.id.contact_separator_char_textview);
    refHolder.normalBackground = view.findViewById(R.id.normal_background);
    refHolder.fistContactBackground = view
            .findViewById(R.id.first_contact_background);
    view.setTag(refHolder);
    return view;
}

public static class ViewHolder implements ViewHolderInterface {
    private LinearLayout header;
    private TextView name;
    private ImageView contactPhoto;
    private TextView charHeader;
    private View normalBackground;
    private View fistContactBackground; 
}

ViewHolder предназначен для ускорения поиска представления, а в newView вы устанавливаете компоненты и сохраняете их в объекте тега.

В вашей деятельности или фрагменте просто нужно установить курсор при его загрузке.

    @Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor currentCursor) {
    contactsAdapter.changeCursor(currentCursor);
}

Теперь вы можете фильтровать или что хотите, а курсор будет обрабатываться загрузчиком :)

С уважением.

person Goofyahead    schedule 09.07.2012
comment
Спасибо. Я посмотрю на то, что вы опубликовали. Однако из того, что я могу сказать, вы создаете новый CursorAdapter с нулевым курсором. Как делается ссылка на существующий во фрагменте курсор? Предполагается ли это через контекст? - person dmfrey; 09.07.2012
comment
Неважно, я пропустил раздел выше в onLoadFinished(). Я думаю, что это та часть, которую мне не хватало. - person dmfrey; 09.07.2012
comment
Спасибо. Это именно то, что я искал. - person dmfrey; 10.07.2012
comment
Это отлично работает, но я думаю, что может быть проблема. Мои подсчеты на секцию, кажется, отключены на 2. Просто для вашего сведения. Я собираюсь изучить это немного глубже - person dmfrey; 11.07.2012
comment
Что вы имеете в виду под графическим разделом? не могли бы вы объяснить это дальше? :) - person Goofyahead; 11.07.2012
comment
Что я вижу, так это то, что когда отображается новый заголовок раздела, последняя строка в предыдущем разделе никогда не отображается, потому что отображается только заголовок. - person dmfrey; 11.07.2012
comment
я работаю над этим, но хотел дать вам информацию на случай, если вы не видите определенные строки в своем окончательном выводе. - person dmfrey; 11.07.2012
comment
вот фактический код, над которым я работаю ссылка - person dmfrey; 11.07.2012
comment
Можете ли вы дать мне полное решение, я ищу решение. мне нужно начать с самого начала. пожалуйста, помогите мне, мне нужно реализовать это - person koteswara D K; 12.12.2016

Создайте новый адаптер, который расширяет BaseAdapter. Затем в вашем адаптере объявите поле private Cursor c и передайте курсор этому адаптеру через конструктор класса. В вашем адаптере реализованы нужные методы и все. Здесь, например, вы можете прочитать, как реализовать собственный BaseAdapter. Кроме того, вы можете взглянуть на реализацию SimpleCursorAdapter в AOSP.

person Yury    schedule 09.07.2012
comment
Спасибо. Я посмотрю на источник SimpleCursorAdapter. - person dmfrey; 09.07.2012