restartLoader()和initLoader()片段中的第三个参数
问题描述:
我是Android的初学者。出于这个原因,我第一次设计了我的项目活动,一切正常。然后,为了使用导航抽屉,我将我的活动改为碎片。restartLoader()和initLoader()片段中的第三个参数
搜索功能,我使用的装载机填好单子。当用户提交搜索我重新启动加载程序的搜索结果。
我的片段:
public class NewsListFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<News>> {
private static final int NEWS_LOADER_ID = 2;
private NewsAdapter adapter;
public NewsListFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_news_list, container, false);
setHasOptionsMenu(true);
if(isNetworkConnected()) {
// Definition NewsAdapter with empty ArrayList (new ArrayList()) and appropriation it to adapter
adapter = new NewsAdapter(getActivity(), 0, new ArrayList());
// Set listView adapter
listView.setAdapter(adapter);
// Initialize loader
getActivity().getSupportLoaderManager().initLoader(NEWS_LOADER_ID, null, this);
}
else {
...
}
});
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.news_list_menu, menu);
MenuItem menuItem = menu.findItem(R.id.option_search);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query!=null && !query.isEmpty()) {
Bundle bundle = new Bundle();
bundle.putString("query_key", query);
getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, this);
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.option_settings) {
...
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public Loader<List<News>> onCreateLoader(int id, Bundle args) {
String query = "";
if (args!=null){
query = args.getString("query_key");
}
/* Definition Uri and append his relevant parameters */
Uri baseUri = Uri.parse("...");
Uri.Builder uriBuilder = baseUri.buildUpon();
uriBuilder.appendQueryParameter("q", query);
/* Define NewsLoader with uri */
return new NewsLoader(getActivity(), uriBuilder.toString());
}
@Override
public void onLoadFinished(Loader<List<News>> loader, List<News> newsList) {
adapter.clear();
if(newsList!=null && !newsList.isEmpty()) {
adapter.addAll(newsList);
}
}
@Override
public void onLoaderReset(Loader loader) {
adapter.clear();
}
/* Check connectivity and network status */
private boolean isNetworkConnected() {
...
}
}
符合:
getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, this);
为 “本” 是一个错误。谁说:
wrong 3rd argument type... required android.support.v4.app.LoaderManager.LoaderCallbacks<java.lang.object>
我甚至尝试改变这一行是这样的:
getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, (LoaderManager.LoaderCallbacks<List<News>>)getActivity()
,但它崩溃,并显示在我的logcat如下:
MainActivity不能转换到Android .support.v4.app.LoaderManager $ LoaderCallbacks
我明白,在onCreateView()加载器没有问题,“这个”! 但onCreateOptionsMenu()> searchView.setOnQueryTextListener()> onQueryTextSubmit 有问题!
任何人都可以告诉我,我必须写什么而不是“这个”来搜索?
我进口:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.widget.SearchView;
答
上onQueryTextSubmit
,这指的是要创建这是不实现LoaderManager.LoaderCallbacks<List<News>>
匿名内部类,与new SearchView.OnQueryTextListener(
。使用
getLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, NewsListFragment.this);
应该解决您的问题