Android Listview при перестройке не показывает новые элементы, пока не прокрутить вниз
Итак, у меня есть список, который заполняется путем извлечения данных JSON из Интернета. Я обернул элемент в SwypeRefreshLayout. Происходит следующее: когда я извлекаю данные, собираю данные, очищаю Arraylist, перестраиваю его и затем уведомляю адаптер об изменении набора данных. Однако я не вижу новых данных сразу. Для того, чтобы увидеть новые элементы вверху, мне нужно прокрутить страницу вниз, чтобы она исчезла, а затем вернуться назад.
Вот код, который я использую для обновления списка.
swipelists.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() {
@Override public void onRefresh() {
if(getArguments().getInt(ARG_SECTION_NUMBER) == 3 ) {
recentArrayList.clear();
long totalSize = 0;
recadapter = new ArrayAdapter(ctx,android.R.layout.simple_list_item_1, recentArrayList);
new updatetheRecent().execute(ctx);
}
else {
swipelists.setRefreshing(false);
}
}});
Вот функция, которая вызывается для перестройки списка
private class updatetheRecent extends AsyncTask<Context, Integer, Long> {
protected Long doInBackground(Context... urls) {
int count = urls.length;
long totalSize = 0;
try {
HttpClient httpclient = new DefaultHttpClient(); // Create HTTP Client
HttpGet httpget = new HttpGet("http://test.net/pltxtrec.php");
HttpResponse response = httpclient.execute(httpget); // Executeit
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent(); // Create an InputStream with the response
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) // Read line by line
sb.append(line + "\n");
String resString = sb.toString(); // Result is here
JSONArray json = new JSONArray(resString);
for (int i = 0; i < json.length(); i++) {
JSONObject json_data = json.getJSONObject(i);
String jsonvalues = json_data.getString("title");
if (!jsonvalues.equals("")) {
recentArrayList.add(json_data.getString("artist") + " - " + json_data.getString("title"));
// .. get all value here
}
}
if (recentArrayList.isEmpty()) {
recentArrayList.add("No items currently in queue");
}
is.close(); // Close the stream
getActivity().runOnUiThread(new Runnable() {
public void run() {
recadapter.notifyDataSetChanged();
swipelists.setRefreshing(false);
}
});
}
catch (Exception e) {
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
if (recentlist != null) {
// Tried adding this is but its never called
recentlist.smoothScrollToPosition(0);
}
}
}
2 ответа
Пожалуйста, попробуйте этот код.
runOnUiThread(run);
OnCreate (), вы устанавливаете свой работающий поток:
run = new Runnable() {
public void run() {
//reload content
arraylist.clear();
arraylist.addAll(db.readAll());
adapter.notifyDataSetChanged();
listview.invalidateViews();
listview.refreshDrawableState();
}
};
Вместо того, чтобы использовать getActivity().runOnUiThread()
, вызов
recadapter.notifyDataSetChanged();
swipelists.setRefreshing(false);
на onPostExecute()
метод (который работает в потоке пользовательского интерфейса).
Если это не работает, попробуйте позвонить invalidate()
на SwypeRefreshLayout.
Ваш HTTP-запрос является асинхронной задачей, то есть он будет возвращаться при возврате, вы не можете нарисовать содержимое того, что еще не пришло.
Я не проверял его, но похоже, что вам нужен метод isRefreshing() из SwipeRefreshLayout. https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html