3

私はこれを行う方法を探していましたが、私の発見ではかなり不足しています。

アプリケーションに ContentProvider を実装しました。私のフラグメントは、CursorLoader コールバックを使用して ContentProvider を照会しています。

通常、SimpleCursorAdapter は結果のレンダリングに使用されますが、カスタム ベース アダプターを作成して、表示されるセクション ヘッダーでこれらの結果を変更できるようにしたいと考えています。

私の全体的な質問は、カーソルの結果をカスタム BaseAdapter に渡すにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

3

私がすることは、CursorAdapter から拡張する CustomCursorAdapter を作成することです。

これはあなたが使うことができる例です:)

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 ではコンポーネントを設定して Tag オブジェクトに格納します。

アクティビティまたはフラグメントでは、ロード時にカーソルを設定するだけです。

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

これで、フィルタリングまたは必要なものを何でも実行でき、カーソルはローダーによって処理されます:)

よろしく。

于 2012-07-09T14:10:56.700 に答える
-1

BaseAdapter を拡張する新しい Adapter を作成します。次に、アダプターでフィールドを宣言し、private Cursor cクラス コンストラクターを介してカーソルをこのアダプターに渡します。アダプターに必要なメソッドを実装するだけです。ここでは、たとえば、カスタム BaseAdapter を実装する方法を読むことができます。さらに、AOSP での SimpleCursorAdapter の実装を見ることができます。

于 2012-07-09T13:28:48.060 に答える