我有一个应用程序,它执行以下操作:带有 ListView 的 Activity 显示三个项目:Beginning、Intermediate、Advanced。根据用户的选择,应用程序应该转到带有 ListView 的 Fragment,它显示来自底层 SQLiteDatabase 的所有项目,其中 Level=Beginning 或 Intermediate 或 Advanced。这第二步对我不起作用。我已经通过调试器验证了我的数据库中有数据,所以这不是问题。这是我在初始 Activity 中的代码 - 这是来自 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);
}
}
这是 StitchList 类,它是 Fragment 类,在上面的代码中引用:
public class StitchList extends FragmentActivity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.stitchfragment);
}
}
这是 Fragment 的 XML 文件,称为stitchfragment.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 类。我正在使用支持库和带有 ContentProvider 的 CursorLoader,称为 StitchProvider;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 语法,但是...... 2)在片段的 onActivityCreated 方法中为 viewID 分配值时,我是否指向正确的位置?3) 同样,在下一行 SimpleCursorAdapter 中,这里的 android.R.layout.simple_list_item_1 是否正确?还是应该是 R.layout.stitchfragment?4)我在ContentProvider的查询方法上放了一个断点,我从来没有打过断点。创建 CursorLoader 时不应该吗?此外,如果我在 List Fragment 的 onLoadFinished 方法上设置断点,光标为空。我错过了什么 5) 我被告知 Fragment 的 onActivityCreated 方法中的 dataColumns 应该包含我的表的 _id 列。真的吗?这对我来说似乎很奇怪,因为列表只会显示一条信息:stitchname。但是,无论此处是否包含 _id,Fragment 列表都不会显示任何内容 6) 我是否可以像在 Fragment 的 onActivityCreatedMethod 中那样通过 getLoaderManager.initLoader 将 Bundle、信息传递给 CursorLoader?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 我错过了什么 5) 我被告知 Fragment 的 onActivityCreated 方法中的 dataColumns 应该包含我的表的 _id 列。真的吗?这对我来说似乎很奇怪,因为列表只会显示一条信息:stitchname。但是,无论是否包含 _id,Fragment 列表都不会显示任何内容 6) 我是否可以像在 Fragment 的 onActivityCreatedMethod 中那样通过 getLoaderManager.initLoader 将 Bundle、信息传递给 CursorLoader?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 我错过了什么 5) 我被告知 Fragment 的 onActivityCreated 方法中的 dataColumns 应该包含我的表的 _id 列。真的吗?这对我来说似乎很奇怪,因为列表只会显示一条信息:stitchname。但是,无论是否包含 _id,Fragment 列表都不会显示任何内容 6) 我是否可以像在 Fragment 的 onActivityCreatedMethod 中那样通过 getLoaderManager.initLoader 将 Bundle、信息传递给 CursorLoader?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 因为该列表只会显示一条信息:针迹名称。但是,无论此处是否包含 _id,Fragment 列表都不会显示任何内容 6) 我是否可以像在 Fragment 的 onActivityCreatedMethod 中那样通过 getLoaderManager.initLoader 将 Bundle、信息传递给 CursorLoader?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 因为该列表只会显示一条信息:针迹名称。但是,无论此处是否包含 _id,Fragment 列表都不会显示任何内容 6) 我是否可以像在 Fragment 的 onActivityCreatedMethod 中那样通过 getLoaderManager.initLoader 将 Bundle、信息传递给 CursorLoader?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 就像我在 Fragment 的 onActivityCreatedMethod 中所做的那样?7) 我已经看到在片段的 onActivityCreated 方法中在 getLoaderManager().initLoader() 之前调用 setListAdapter 的示例,并且我看到了之后调用 setListAdapter 的示例。哪个是对的?似乎都没有帮助我.... 就像我在 Fragment 的 onActivityCreatedMethod 中所做的那样?7) 我已经看到在片段的 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);
所以我知道我可以在 Fragment 中显示数据;它似乎不适用于 CursorLoader 和 ContentProvider。我希望这不是信息过载;如果是的话,我很抱歉。如果有人有任何想法,我将不胜感激。