【发布时间】:2012-12-06 06:04:18
【问题描述】:
长按列表项时,我有带有上下文菜单的列表片段。单击列表项并从我的数据库中删除列表项。但是调用restart loader后列表也不刷新?
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setEmptyText("Loading...");
myAdapter = new MySimpleCursorAdapter(getActivity().getApplicationContext(), R.layout.my_list_item, null, new String[] {DBConstants.NAME,DBConstants.ITEM1,DBConstants.SYMBOL}, new int[] {R.id.my_companyname,R.id.my_item1,R.id.my_symbol},0);
setListAdapter(myAdapter);
registerForContextMenu(getListView());
MyLoader = getActivity().getSupportLoaderManager().initLoader(1, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
DBHelper dbHelper=new DBHelper(getActivity());
return new MyLoader(getActivity(),dbHelper);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
if(c!=null && c.getCount()>0){
myAdapter.swapCursor(c);
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
else
{
setEmptyText("Not selected");
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
myAdapter.swapCursor(null);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
String selectedItem = item.getTitle().toString();
Log.i("context", "selected context menu item->"+selectedItem);
if(selectedItem.equalsIgnoreCase("Remove"))
{
AdapterView.AdapterContextMenuInfo menuInfo=(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
String[] args={String.valueOf(menuInfo.id)};
Log.i("context", String.valueOf(menuInfo.id));
new DBHelper(getActivity()).getWritableDatabase().delete(DBConstants.MYSTOCKS_TABLE, "_ID=?", args);
getActivity().getSupportLoaderManager().restartLoader(1, null, this);
/*
Cursor cursor = myAdapter.getCursor();
myAdapter.swapCursor(cursor);
*/
//getLoaderManager().initLoader(0, null, this);
}
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
//super.onCreateContextMenu(menu, v, menuInfo);
getActivity().getMenuInflater().inflate(R.menu.mystocks_context, menu);
}
【问题讨论】:
-
你测试
onLoadFinished重启Loader后是否收到一些有效数据? -
我删除了 onLoadFinished 中的 if(c!=null && c.getCount()>0)-if else 语句。现在它交换光标和刷新列表。但是现在我在 onActivityCreated 中初始化了加载器,它有时调用 onLoadFinished 而不调用 onCreateLoader。
-
onLoadFinished不能在没有onCreateLoader之前被调用的情况下被调用。是否有任何理由调用getActivity().getLoaderManager()...并存储Loader?只需致电getSupportLoaderManager().initLoader(1, null, this);。 -
实际上我有标签及其内容作为片段。每当我在 tab1 内容中添加一个项目时,它都会反映在 tab2 内容上。在第一次创建活动时,如果在Tab1中选择一个项目,它会反映在tab2中。但是下次我移动到 tab1 并选择另一个项目时,它不会反映在 Tab2 上(因为在 onActivitycreated 中初始化了加载器。现在我只替换了片段)。我试图在 onCreate 中初始化加载器,但它说 Content View not created still.i已完成加载中的交换光标适配器。
-
如果没有看到有关如何操作这些片段的代码,我会说在 tab2 片段中有一个布尔字段,这应该表明需要重新启动加载程序(在
onResume方法中)并更新它每当您更改其数据时,tab1 片段中的字段。
标签: android android-listfragment android-loadermanager