Lassen Sie mich damit beginnen, dass dies keine Frage zum Scrollen von ListViews ist. Ich möchte nicht wissen, wie ich feststellen kann, wenn ein Benutzer zum Ende einer Liste scrollt. Geben Sie mir also keine Antworten auf diese Frage oder markieren Sie diese als Duplikat.Sagen Sie Android AsyncTaskLoader, um mehr Daten zu erhalten
Ich verwende eine Klasse, die AsyncTaskLoader erweitert, um ein ListView mit Daten aus einem Webdienst zu füllen.
Zunächst lade ich 50 Artikel und alles funktioniert super. Ich muss wissen, wie ich dem Loader sagen kann, dass er die nächsten 50 Elemente schrittweise laden soll. Ich verstehe, wo dies im ListView-Code zu tun, aber Ich kann nicht herausfinden, die beste Möglichkeit, den Loader, dass ich mehr Daten laden will, ohne es neu zu setzen und alles wieder zu laden.
Noch einmal, um zu verdeutlichen, das Problem, das ich hier zu lösen versuche, ist nur der Loader, dass mehr Daten geladen werden müssen. Es weiß bereits, wie man mehr Daten lädt, wenn loadInBackground() ein zweites Mal aufgerufen wird und der ListView bereits weiß, wo/wann der Loader benachrichtigt werden soll, die Frage ist nur wie.
Einige der entsprechende Code:
@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 Bitte lesen Sie diese Frage. Sie werden feststellen, dass es sich NICHT um ein Duplikat der von Ihnen aufgelisteten Frage handelt. – drewhannay
Weitere Daten müssen für dieselbe Abfragezeichenfolge geladen werden? Jedenfalls würde ich den 'Loader' fallen lassen und eine' AsyncTask' oder einen normalen Thread verwenden, um zusätzliche Daten zu laden. – Luksprog
Aber ist ein Loader nicht der empfohlene Weg zur Bereitstellung von Daten zur Unterstützung eines ListView? Eine AsyncTask verarbeitet keine Konfigurationsänderungen und Loader tun dies. – drewhannay