android - 告诉 Android AsyncTaskLoader 检索更多数据

标签 android android-loadermanager android-loader

首先让我说这不是关于滚动 ListView 的问题。我不想知道如何判断用户何时滚动到列表底部,所以请不要给我该问题的答案,或将其标记为重复。

我正在使用一个扩展 AsyncTaskLoader 的类来使用来自 Web 服务的数据填充 ListView。

最初,我加载了 50 个项目,一切都运行良好。我需要知道如何告诉 Loader 以增量方式加载接下来的 50 个项目。我了解在 ListView 代码中的何处执行此操作,但我无法找到告诉加载程序我想要加载更多数据的最佳方式,而不重置它并重新加载所有内容。

再次澄清一下,我在这里试图解决的问题只是通知加载程序需要加载更多数据。它已经知道如何在第二次调用 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;
}

最佳答案

我想出了一个可行的方法。在我的 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();
        // ...
    }
}

我仍然想知道这是否是“最佳实践”的做法,但它似乎暂时解决了我的问题。

关于android - 告诉 Android AsyncTaskLoader 检索更多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16899277/

相关文章:

带有自定义图像和进度指示器的 Android 加载进度条

android - Gradle 和 Android v7 兼容问题

Android SD卡安装延迟

android - 错误 : java. lang.NullPointerException 在 android.support.v4.content.Loader

android - ExpandableListFragment 与 LoaderManager 兼容包

android - 为什么Loaders不能是非静态内部类?

android - Android Loader 中 onCanceled() 的用途是什么

java - 无法将 db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' 的区域设置更改为 'en_US'

android - android.permission.REAL_GET_TASKS 权限是什么?

安卓漏洞?在正确项目的项目动画期间,数据库更新后错误的行开始在 ListView 上动画