0

レイアウト XML を介して親フラグメントに埋め込まれたリスト フラグメントを使用しようとしています (変更なしでフラグメント マネージャーを使用したこともあります)。リストフラグメントを単独で埋め込むと、カーソルからコンテンツを見ることができます。親フラグメント (ShoppingListActivity) の onCreateView をオーバーライドしてカスタム ビューを返すと、リスト フラグメントのコンテンツを表示できなくなります。

リスト フラグメントでは、CursorLoader を使用しており、onLoadFinished は常にコンテンツを持つカーソルで呼び出されるため、親フラグメントを組み合わせてカスタム レイアウトを使用するときにデータが存在しないという問題はありません。リストフラグメントにはカスタムレイアウトがありません(最初は、リストフラグメントの onCreateView をオーバーライドして親フラグメントのボタンを追加することから始めましたが、同じ結果が得られました)

私も最初はフラグメントのサポート ライブラリを使用していましたが、現在はネイティブ フラグメントを使用しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
 <Button
    android:id="@+id/btn_shopping_list_add_item_manually"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@+id/btn_shopping_list_add_item_barcode"
    android:onClick="addItemManually"
    android:text="TYPE"
    />

<Button
    android:id="@+id/btn_shopping_list_add_item_barcode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:onClick="addItemFromBarcode"
    android:text="SCAN"
    />
<fragment     android:name="com.ainesophaur.shopping.assistant.fragments.ShoppingListFragment"
    android:id="@+id/list"
    android:layout_height="0dp"
    android:layout_below="@+id/btn_shopping_list_add_item_manually"
    android:layout_alignParentLeft="true"
    android:layout_width="fill_parent" />

- -編集 - -

まだ画像アップ出来ないので描いてみます

onCreateView がオーバーライドされ、カスタム ビューが提供されると (上記の XML レイアウト)、次のようになります。

ボタン1 ボタン2

何もない

リストビューフラグメントを直接呼び出すと、

リスト
アイテム 1 リスト アイテム 2

リスト ビュー フラグメントには、CursorAdapter から拡張されたカスタム アダプターがあり、onCreateView から返された上記の指定された XML レイアウトがある場合、アダプターの newView と bindView は呼び出されません。

また、(フラグメント自体を含める代わりに) 親フラグメント XML にリストビュー項目を含めようとし、リストの標準の Android ID を指定しましたが、それでも同じ結果が得られます..リストビューに一意の ID を指定するとリストで setAdapter を呼び出すと、カーソルローダーの onLoadFinished ---EDIT の後、結果も得られません (つまり、アダプターの bindView と newView は呼び出されません)。

これで画像をアップロードできます:)

欠落リスト

リスト表示


これは、ListFragment と CursorAdapter を含むコードです。

リストフラグメント

public class ShoppingListFragment extends ListFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
    private int mStoreID;
    private long mListID;
    private String mStoreName;
    private ShoppingListItemsAdapter adapter;
    private Context mContext;
    private Cursor mCursor;
    private static final int SHOPPING_LIST_LOADER = 0x04;

     CursorLoader cursorLoader;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getActivity();
        Bundle args = getArguments();
        mListID = 4; //args.getLong("listid");
        //mStoreName = args.getString("storename");

    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mContext = getActivity();
        adapter = new ShoppingListItemsAdapter(mContext, mCursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        setListAdapter(adapter);
        //setListAdapter(adapter);
        getLoaderManager().initLoader(SHOPPING_LIST_LOADER, null, this);
    }
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        cursorLoader = new CursorLoader(getActivity(),
                 Uri.withAppendedPath(ShoppingListProvider.CONTENT_LIST_ITEMS_URI, String.valueOf(mListID)), ShoppingDBAdapter.joinitemProj, null, null, null);
        return cursorLoader;
    }
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        adapter.swapCursor(cursor);
        //setListShown(true);
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }

    private OnClickListener addManual = new OnClickListener() {

        @Override
        public void onClick(View v) {
            Fragment fragment = new AddItemFragment();
            Bundle args = new Bundle();
            args.putLong("listid", mListID);
            fragment.setArguments(args);
            getFragmentManager().beginTransaction()
            .replace(R.id.container, fragment).addToBackStack(null)
            .commit();

            return;

        }
    };
    private static class ShoppingListItemViewHolder {
        public TextView separator;
        public TextView itemQuantity;
        public TextView itemName;
        public TextView itemPrice;
        public CharArrayBuffer quantityObtainedBuffer = new CharArrayBuffer(128);
        public CharArrayBuffer quantityNeededBuffer = new CharArrayBuffer(128);
        public CharArrayBuffer titleBuffer = new CharArrayBuffer(128);
        public CharArrayBuffer priceBuffer = new CharArrayBuffer(128);
        public CharArrayBuffer itemCategoryBuffer = new CharArrayBuffer(128);
  }
    public void addItemFromBarcode(View v)
    {
        return;
    }

拡張された CursorAdapter

private static class ShoppingListItemsAdapter extends CursorAdapter
{
    private static final int STATE_UNKNOWN = 0;
    private static final int STATE_SECTIONED_CELL = 1;
    private static final int STATE_REGULAR_CELL = 2;
    String LAST_CATEGORYNAME = "";
    private final CharArrayBuffer mBuffer = new CharArrayBuffer(128);
    private int[] mCellStates;

    public ShoppingListItemsAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        mCellStates = (c == null) ? null : new int[c.getCount()];
    }
      @Override
        public void changeCursor(Cursor cursor) {
            super.changeCursor(cursor);
            mCellStates = (cursor == null) ? null : new int[cursor.getCount()];
        }
      @Override
        public Cursor swapCursor(Cursor cursor) {
            Cursor oldCursor = super.swapCursor(cursor);
            mCellStates = (cursor == null) ? null : new int[cursor.getCount()];
            return oldCursor;
        }
      @Override
        public void bindView(View view, Context context, Cursor cursor) {

          final ShoppingListItemViewHolder holder = (ShoppingListItemViewHolder) view.getTag();
          final int COLUMN_NAME_INDEX = cursor.getColumnIndex(ShoppingDBAdapter.KEY_NAME);
          final int COLUMN_ITEMCATEGORY_INDEX = cursor.getColumnIndex(ShoppingDBAdapter.KEY_CATEGORYID);
          final int COLUMN_PRICE_INDEX = cursor.getColumnIndex(ShoppingDBAdapter.KEY_PRICE);
          final int COLUMN_OBTAINED_INDEX = cursor.getColumnIndex(ShoppingDBAdapter.KEY_OBTAINED);
          final int COLUMN_NEEDED_INDEX = cursor.getColumnIndex(ShoppingDBAdapter.KEY_NEEDED);
          boolean needSeparator = false;  
          final int position = cursor.getPosition();
          cursor.copyStringToBuffer(COLUMN_NAME_INDEX, holder.titleBuffer);
          cursor.copyStringToBuffer(COLUMN_PRICE_INDEX, holder.priceBuffer);
          cursor.copyStringToBuffer(COLUMN_NEEDED_INDEX, holder.quantityNeededBuffer);
          cursor.copyStringToBuffer(COLUMN_ITEMCATEGORY_INDEX, holder.itemCategoryBuffer);
          switch (mCellStates[position]) 
             {
                  case STATE_SECTIONED_CELL:
                      needSeparator = true;
                      break;

                  case STATE_REGULAR_CELL:
                      needSeparator = false;
                      break;

                  case STATE_UNKNOWN:
                  default:
                      if (position == 0) {
                          if(holder.itemCategoryBuffer.sizeCopied > 0)
                          {
                              needSeparator = true;
                              int holderStoreNameSize = holder.itemCategoryBuffer.sizeCopied;
                              String holderStoreName = "";
                              for(int i = 0; i < holderStoreNameSize; i++)
                              {
                                  holderStoreName += holder.itemCategoryBuffer.data[i];
                              }
                              LAST_CATEGORYNAME = holderStoreName;
                          }
                      } 
                      else 
                      {
                          cursor.moveToPosition(position - 1);
                          cursor.copyStringToBuffer(COLUMN_ITEMCATEGORY_INDEX, mBuffer);
                          if (mBuffer.sizeCopied > 0 && holder.itemCategoryBuffer.sizeCopied > 0) 
                          {
                              int mBufferSize = mBuffer.sizeCopied;
                              int holderStoreNameSize = holder.itemCategoryBuffer.sizeCopied;
                              String mBufferName = "";
                              String holderStoreName = "";
                              for(int i = 0; i < holderStoreNameSize; i++)
                              {
                                  holderStoreName += holder.itemCategoryBuffer.data[i];
                              }
                              if(!LAST_CATEGORYNAME.equals(holderStoreName))
                              {
                                  needSeparator = true;
                                  LAST_CATEGORYNAME = holderStoreName;
                              }
                          }
                          cursor.moveToPosition(position);
                      }
                      mCellStates[position] = needSeparator ? STATE_SECTIONED_CELL : STATE_REGULAR_CELL;
                      break;
              }
          if (needSeparator) {
                holder.separator.setText(holder.itemCategoryBuffer.data, 0 , holder.itemCategoryBuffer.sizeCopied);
                holder.separator.setVisibility(View.VISIBLE);
            } else {
                holder.separator.setVisibility(View.GONE);
            }
            holder.itemName.setText(holder.titleBuffer.data, 0, holder.titleBuffer.sizeCopied);
            holder.itemPrice.setText(holder.priceBuffer.data, 0, holder.priceBuffer.sizeCopied);
            holder.itemQuantity.setText(holder.quantityNeededBuffer.data, 0, holder.quantityNeededBuffer.sizeCopied);
      }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
         View v = LayoutInflater.from(context).inflate(R.layout.fragment_shopping_list_items_row, parent, false);
         ShoppingListItemViewHolder holder = new ShoppingListItemViewHolder();
         holder.separator = (TextView)v.findViewById(R.id.separator);
         holder.itemName = (TextView)v.findViewById(R.id.item_name);
         holder.itemPrice = (TextView)v.findViewById(R.id.item_price);
         holder.itemQuantity = (TextView)v.findViewById(R.id.item_quantity);
         v.setTag(holder);
         return v;
    }
}
4

2 に答える 2

1

リストビューフラグメントで使用されるレイアウトXMLをRelativeLayoutからLinearLayoutに変更すると、アイテムを表示できるようになりました。

于 2012-08-22T19:35:11.097 に答える
0

レイアウトでフラグメントの高さをゼロに設定したため、何も表示されないため、layout_height を別の値に設定します。(フラグメントタグの属性を参照してください)

于 2012-08-18T02:20:36.980 に答える