Позвольте мне начать, сказав, что это НЕ вопрос о прокрутке ListViews. Я не хочу знать, как сказать, когда пользователь прокручивается до нижней части списка, поэтому, пожалуйста, не давайте мне ответов на этот вопрос или не отмечайте это как дубликат.Сообщите Android AsyncTaskLoader, чтобы получить больше данных
Я использую класс, который расширяет AsyncTaskLoader для заполнения ListView данными из веб-службы.
Первоначально, я загружаю 50 предметов и все отлично работает. Мне нужно знать, как сообщить загрузчику загружать следующие 50 элементов поэтапно. Я понимаю WHERE, чтобы сделать это в коде ListView, но Я не могу понять, как лучше сказать загрузчику, что я хочу загрузить больше данных, не перезагружая его и не загружая все снова.
Опять же, чтобы пояснить, проблема, которую я пытаюсь решить здесь, просто уведомляет загрузчика о необходимости загрузки большего количества данных. Он уже знает, как загружать больше данных, когда loadInBackground() вызывается во второй раз, и ListView уже знает, где/когда нужно уведомить загрузчика, вопрос только как.
Некоторые из соответствующего кода:
@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;
}
@GeorgeStocker Пожалуйста, прочтите этот вопрос. Вы увидите, что это не дубликат вопроса, который вы указали. – drewhannay
Необходимо загрузить дополнительные данные для одной и той же строки запроса? В любом случае я бы сбросил «Loader» и использовал «AsyncTask» или обычный поток для загрузки дополнительных данных. – Luksprog
Но разве загрузчик не рекомендуется использовать для предоставления данных для возврата в ListView? AsyncTask не обрабатывает изменения конфигурации и Loaders. – drewhannay