- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 Android 的初学者。出于这个原因,我首先设计了带有 Activity 的项目,一切正常。然后为了使用抽屉导航,我将我的 Activity 更改为 fragment 。
我有一个显示新闻列表的 fragment ,我在选项菜单中有一个搜索功能
我使用加载程序来填写列表。当用户提交搜索时,我会重新启动加载器以获取搜索结果。
我的 fragment :
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);
“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 cannot be cast to android.support.v4.app.LoaderManager$LoaderCallbacks
我明白 onCreateView() 中的加载程序与“this”没有问题!但在 onCreateOptionsMenu()>searchView.setOnQueryTextListener()>onQueryTextSubmit有问题!
任何人都可以告诉我我必须写什么而不是“this”来进行搜索吗?
我的导入:
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
,这是指您正在创建的匿名内部类,带有 new SearchView.OnQueryTextListener(
哪个没有执行 LoaderManager.LoaderCallbacks<List<News>>
.使用
getLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, NewsListFragment.this);
应该可以解决你的问题
关于android - restartLoader() 和 initLoader() fragment 中的第三个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646406/
我正在尝试使用commonsware的LoaderEx在我的项目中。所以我测试了LoaderExDemo项目。效果很好。但是当我将设备从纵向模式更改为横向模式时 loader变量将为null。 在 o
我正在尝试使用带有 asynctaskloader 的加载器将我的 ListView 加载到 fragment 上,但在启动加载器时出错: The method initLoader(int, Bun
我有一个非常简单的带有 ListView、CursorLoader 和 CursorAdapter 的 Fragment。一切都在单个 Activity 中(只是切换 fragment )。我的问题是
我正在使用 CursorLoader 从 fragment 中的 SQLite 中获取一些数据。为此的 initLoader() 在 onActivityCreated() 中执行... public
我知道有很多这样的常见问题,但我似乎找不到解决方案。当我尝试使用 getLoaderManager().initLoader(LOADER_ID, null, this); 初始化加载程序时,错误 T
有没有人介绍一下initLoader()的Bundle args参数的用法?对象只是设置在生成的游标上,还是有办法从被查询的数据源(如内容提供程序)访问该对象? 来自文档: args Optional
我是 Android 的初学者。出于这个原因,我首先设计了带有 Activity 的项目,一切正常。然后为了使用抽屉导航,我将我的 Activity 更改为 fragment 。 我有一个显示新闻列表
我有一个 fragment ,并希望在单击按钮时启动加载器: public class MyFragment extends Fragment { public void onActivity
getLoaderManager 已在 android 28 中弃用。 ViewModel、Repository 和 Room 替换了加载程序功能 我找到了2篇文章: https://medium.c
在我的 Activity 中,我有一个代表医生的 ListView 。每行都有医生的名字和一个复选框。 I have implemented a callback interface so that
我卡在我的代码中,我正在使用抽屉布局,而在 fragment 布局上,我想在从数据库中获取人员列表后显示它。在 fragment 类中,当我使用游标适配器查询并将其设置为列表适配器时,错误显示: 类型
我看到了 previuos question import android.app.ListFragment; import android.app.LoaderManager.LoaderCallb
Google 建议我们在 Fragment 的 onActivityCreated 中调用 getLoaderManager().initLoader(0, null, this); http://d
我在关注 guide 时遇到问题在 Android 中使用 SQLite。我正在使用 ListFragment而不是 ListActivity (如示例中),所以我有 ListFragment实现Lo
我是一名优秀的程序员,十分优秀!