Hãy để tôi bắt đầu bằng cách nói đây không phải là câu hỏi về việc cuộn ListView. Tôi không muốn biết cách người dùng cuộn xuống cuối danh sách, vì vậy, vui lòng không trả lời cho câu hỏi đó hoặc đánh dấu câu trả lời này là trùng lặp.Yêu cầu Android AsyncTaskLoader truy xuất thêm dữ liệu
Tôi đang sử dụng một lớp mở rộng AsyncTaskLoader để điền một ListView với dữ liệu từ một dịch vụ web.
Ban đầu, tôi tải 50 mục và mọi thứ đang hoạt động tuyệt vời. Tôi cần phải biết làm thế nào để nói cho các Loader để tải 50 mục tiếp theo tăng dần. Tôi hiểu WHERE để làm điều này trong mã ListView, nhưng Tôi không thể tìm ra cách tốt nhất để nói cho Trình tải mà tôi muốn tải thêm dữ liệu mà không cần đặt lại và tải lại mọi thứ.
Một lần nữa, để làm rõ, vấn đề tôi đang cố gắng giải quyết ở đây chỉ là thông báo cho bộ nạp rằng cần phải tải thêm dữ liệu. Nó đã biết cách tải thêm dữ liệu khi loadInBackground() được gọi là lần thứ hai và ListView đã biết vị trí/khi nào cần thông báo cho Trình tải, câu hỏi chỉ là cách.
Một số mã có liên quan:
@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 Vui lòng đọc câu hỏi này. Bạn sẽ thấy rằng nó KHÔNG phải là một bản sao của câu hỏi mà bạn đã liệt kê. – drewhannay
Cần thêm dữ liệu cho cùng một chuỗi truy vấn? Dù sao tôi sẽ thả 'Loader' và sử dụng một' AsyncTask' hoặc một luồng bình thường để tải dữ liệu bổ sung. – Luksprog
Nhưng không phải là một Trình tải theo cách được khuyến nghị để cung cấp dữ liệu để quay trở lại một ListView? AsyncTask không xử lý các thay đổi cấu hình và Trình tải làm. – drewhannay