dre*_*nay 6 android android-loadermanager android-loader
让我首先说这不是关于滚动ListViews的问题.我不想知道如何判断用户何时滚动到列表的底部,所以请不要给我这个问题的答案,或者将其标记为重复.
我正在使用一个扩展AsyncTaskLoader的类来使用来自Web服务的数据填充ListView.
最初,我加载50件物品,一切都很好.我需要知道如何告诉Loader以递增方式加载下50个项目.我理解在ListView代码中要执行此操作,但我无法找出告诉Loader我想要加载更多数据而不重置它并再次加载所有内容的最佳方法.
再说一次,澄清一下,我在这里要解决的问题只是通知加载器需要加载更多数据.它已经知道如何在第二次调用loadInBackground()时加载更多数据,并且ListView已经知道在何时/何时通知Loader,问题是如何.
一些相关代码:
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
m_adapter = new SearchAdapter(getActivity());
setListAdapter(m_adapter);
// if the loader doesn't already exist, one will be created
// otherwise the existing loader is reused so we don't have
// to worry about orientation and other configuration changes
getLoaderManager().initLoader(SEARCH_LOADER_ID, null, this);
}
@Override
public Loader<List<Result>> onCreateLoader(int id, Bundle args)
{
String query = args != null ? args.getString(QUERY_KEY) : "";
return new SearchLoader(getActivity(), query);
}
private class SearchAdapter extends ArrayAdapter<Result>
{
// ...
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// ...
if (position == getCount() - 2)
// TODO: Need to notify Loader here
// ...
}
}
private static class SearchLoader extends OurAsyncTaskLoader<List<Result>>
{
public SearchLoader(Context context, String query)
{
super(context);
m_query = query;
m_data = Lists.newArrayList();
m_loadedAllResults = false;
}
@Override
public List<Result> loadInBackground()
{
if (m_loadedAllResults)
return m_data;
// the Loader implementation does a == check rather than a .equals() check
// on the data, so we need this to be a new List so that it will know we have
// new data
m_data = Lists.newArrayList(m_data);
MyWebService service = new MyWebService();
List<Result> results = service.getResults(m_query, m_data.size(), COUNT);
service.close();
if (results == null)
return null;
if (results.size() < COUNT)
m_loadedAllResults = true;
for (Result result : results)
m_data.add(result)
return m_data;
}
private static final int COUNT = 50;
private final String m_query;
private boolean m_loadedAllResults;
private List<Result> m_data;
}
Run Code Online (Sandbox Code Playgroud)
我想出了一个有效的方法。在我的SearchAdapter#getView()方法中,我有以下代码:
private class SearchAdapter extends ArrayAdapter<Result>
{
// ...
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// ...
if (position == getCount() - 2)
getLoaderManager().getLoader(SEARCH_LOADER_ID).onContentChanged();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然想知道这是否是“最佳实践”方式,但它现在似乎解决了我的问题。
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |