Я новичок в разработке Android. Я изучаю это. Я могу получить данные json в списке с помощью Recyclerview. Теперь я хочу включить swiperRefreshLayout, чтобы любое обновление на сервере также отображалось при обновлении. Я ищу руководство по swiperRefreshLayout в json, но это не работает. Я пробовал использовать DefaultHttpClient, но не могу уловить эту идею.
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_health);
mRecyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
mExampleList = new ArrayList<>();
mRequestQueue = Volley.newRequestQueue(this);
parseJSON();
}
private void parseJSON() {
String url = "http://fitandfineindustries.com/healthapi.php";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("info");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject hit = jsonArray.getJSONObject(i);
String creatorName = hit.getString("heading");
String img = hit.getString("img");
String imageUrl = img.length() == 0 ? "file:///android_asset/fitandfineindustries.jpg" : "http://fitandfineindustries.com/images/plan/"+img;
mExampleList.add(new NewsItem(imageUrl, creatorName));
}
mNewsAdapter = new NewsAdapter(HealthActivity.this, mExampleList);
mRecyclerView.setAdapter(mNewsAdapter);
mNewsAdapter.setOnItemClickListener(HealthActivity.this);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mRequestQueue.add(request);
}




SwipeLayout не имеет ничего общего с сервером (сетевые вызовы). Когда пользователь тянет, чтобы обновить, onRefresh () вашего SwipeRefreshLayout вызывается. Вот и все, что делает SwipeRefreshLayout.
Это может вам помочь-
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//call the parseJSON() function here like this.
parseJSON();
// call the setRefreshing(true) function to show
// the circular rotating refresh icon
mSwipeRefreshLayout.setRefreshing(true);
}
});
//Don't forget to hide the refreshing icon when your server call ends like this.
//mSwipeRefreshLayout.setRefreshing(false);
Спасибо, но это не работает, каждый элемент списка дублируется при каждом событии обновления.
При обновлении вызовите ваш parseJSON (), убедитесь, что перед этим вам нужно очистить массив.
SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mExampleList.clear()
parseJSON();
}
});
mExampleList = new ArrayList<>();
mRequestQueue = Volley.newRequestQueue(this);
parseJSON();
}
onRefresh()пуст. Вызовите методpareJSON()внутриonRefresh(), и было бы лучше, если бы адаптерRecyclerViewинициализировался один раз и просто обновил список внутриparseJSON().