次のことを行うアプリがあります: ListView を使用したアクティビティには、初級、中級、上級の 3 つの項目が表示されます。ユーザーの選択に応じて、アプリは、Level=Beginning または Intermediate または Advanced である基になる SQLiteDatabase からのすべての項目を表示する ListView を使用して Fragment に移動する必要があります。この2番目のステップはうまくいきません。データベースにデータがあることをデバッガーで確認したので、それは問題ではありません。最初のアクティビティのコードは次のとおりです。これは onItemClick メソッドからのものです。
final String[] values = new String[] {
"Beginning", "Intermediate", "Advanced"
};
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent choice = new Intent(getApplicationContext(), com.MyKnitCards.project.StitchList.class);
Bundle dataBundle = new Bundle();
String chosenValue = values[position];
dataBundle.putString("Level",chosenValue);
choice.putExtras(dataBundle);
try {
startActivity(choice);
}
}
これは Fragment クラスであり、上記のコードで参照されています。
public class StitchList extends FragmentActivity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.stitchfragment);
}
}
次に、stitchfragment.xml という Fragment の XML ファイルを示します。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<fragment android:id="@+id/frag_stitchlist"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_marginTop="?android:attr/actionBarSize"
class="com.MyKnitCards.project.ListFrag" />
<fragment android:id="@+id/frag_stitchdetail"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.MyKnitCards.project.DetailFrag" />
</LinearLayout>
これが ListFrag クラスです。サポート ライブラリと、StitchProvider という ContentProvider を備えた CursorLoader を使用しています。SQLiteDatabase は SQLData と呼ばれます。
public class ListFrag<Cursor> extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String STITCHTABLE_BASEPATH = "MyStitches_tbl";
private static final String AUTHORITY = "com.MyKnitCards.project.SQLData";
public static final Uri STITCHES_URI = Uri.parse("content://" + AUTHORITY + "/" + STITCHTABLE_BASEPATH);
private static final String[] PROJECTION = new String[] { "_id", "stitchname" };
private SimpleCursorAdapter mAdapter;
private static final int LOADER_ID = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Intent myData = getActivity().getIntent();
Bundle info = myData.getExtras();
String[] dataColumns = { "stitchname", "_id" };
int[] viewIDs = { R.id.frag_stitchlist };
mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1, null, dataColumns, viewIDs, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, info, (LoaderCallbacks<Cursor>) this);
}
public void onListItemClick(ListView l, View v, int position, long id) {
String item = (String) getListAdapter().getItem(position);
DetailFrag frag = (DetailFrag) getFragmentManager().findFragmentById(R.id.frag_stitchdetail);
if (frag != null && frag.isInLayout()) {
frag.setText(item);
}
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String selection = "stitchlevel='" + args.getString("Level") + "'";
return (Loader<Cursor>) new CursorLoader(getActivity(), STITCHES_URI,
PROJECTION, selection, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_ID:
mAdapter.swapCursor((android.database.Cursor) cursor);
break;
}
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
onListItemClick メソッドは、詳細フラグメントにデータを表示するためのものですが、ここまで到達することはありません。Intent のデータに基づいてデータベースから取得されたアイテムのリストは表示されません。
いくつかの考えられる問題/質問が思い浮かびます:
1) onCreateLoader メソッドのクエリの構文は正しいですか? たとえば、「stitchlevel='Beginning'」と読みます。args.getString("Level") のデータが有効であることはわかっています。これは、デバッガーで追跡したためですが、ここでの構文は正しいですか? 私はそれが標準的な SQL 構文であるべきだと仮定していますが... 3) 同様に、次の行の SimpleCursorAdapter は、ここで android.R.layout.simple_list_item_1 は正しいですか? それとも、おそらく R.layout.stitchfragment である必要がありますか? 4) ContentProvider のクエリ メソッドにブレークポイントを設定しましたが、ブレークポイントにヒットしませんでした。CursorLoader が作成されたときにすべきではないですか? さらにList FragmentのonLoadFinishedメソッドにブレークポイントを入れると、カーソルはヌルです。何が欠けていますか 5) Fragment の onActivityCreated メソッドの dataColumns には、テーブルの _id 列を含める必要があると言われました。本当?リストにはステッチ名という 1 つの情報しか表示されないので、私には奇妙に思えます。ただし、_id がここに含まれているかどうかに関係なく、フラグメント リストには何も表示されません。7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... 何が欠けていますか 5) Fragment の onActivityCreated メソッドの dataColumns には、テーブルの _id 列を含める必要があると言われました。本当?リストにはステッチ名という 1 つの情報しか表示されないので、私には奇妙に思えます。ただし、_id がここに含まれているかどうかに関係なく、フラグメント リストには何も表示されません。7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... 欠けているもの 5) Fragment の onActivityCreated メソッドの dataColumns には、テーブルの _id 列を含める必要があると言われました。本当?リストにはステッチ名という 1 つの情報しか表示されないので、私には奇妙に思えます。ただし、_id がここに含まれているかどうかに関係なく、フラグメント リストには何も表示されません。7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... リストにはステッチ名という 1 つの情報しか表示されないためです。ただし、_id がここに含まれているかどうかに関係なく、フラグメント リストには何も表示されません。7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... リストにはステッチ名という 1 つの情報しか表示されないためです。ただし、_id がここに含まれているかどうかに関係なく、フラグメント リストには何も表示されません。7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... フラグメントの onActivityCreatedMethod で行うように? 7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです.... フラグメントの onActivityCreatedMethod で行うように? 7) Fragment の onActivityCreated メソッドで getLoaderManager().initLoader() の前に setListAdapter が呼び出される例と、setListAdapter が後で呼び出される例を見てきました。どちらが正しい?どちらも私を助けないようです....
単純にこれを行うと、フラグメントを表示することができました:
Intent myData = getActivity().getIntent();
Bundle info = myData.getExtras();
String level = info.getString("Level");
String[] values = new String[] {level, level};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
したがって、フラグメントにデータを表示できることはわかっています。CursorLoader と ContentProvider で動作していないようです。これが情報の過負荷でないことを願っています。もしそうなら申し訳ありません。誰かに何かアイデアがあれば、私はとても感謝しています。