對于Android開發來說,這兩個控件相信大家都不會陌生,ListView一個被用爛的控件,經常配合SwipeRefreshLayout來使用,SwipeRefreshLayout可以進行下拉刷新操作,但是我在使用的過程中,遇到了一個問題,那就是當我在下拉刷新時,處于正在刷新的狀態,再次下拉,就會報以下的錯誤
下面我貼一段我寫的代碼
swipe.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {
? ? ? ? @Override
? ? ? ? public void onRefresh() {
? ? ? ? ? ? ? data.clear();
? ? ? ? ? ? ? initData();
? ? ? ? ?}
});
可以看出我是在刷新的過程中將數據源清空,然后再次進行網絡請求,下載數據,更新適配器。這里我把問題出現的地方加粗了,就是這個data.clear()。
我們先分析一下報這個錯誤的原因
當我們進行下拉刷新時,這時候調用了onRefresh()這個方法,將數據源給清空了,然后我們再次點擊,這時候就可能會引起ListView的點擊觸摸事件,然而此時我們的數據是空的,也就會報數組越界的這個問題了。
我的解決方案是:
當我們在進行下拉刷新的時候,先不要急著把數據源清空,我們完全可以在網絡請求成功的回調方法里面進行這一個操作,這樣當我們在刷新的時候數據還是存在的,
StringRequest request =newStringRequest(Address.Latest_News,newResponse.Listener() {
? ? ? ? ? @Override
? ? ? ? ? public voidonResponse(String response) {
? ? ? ? ? ? ? ? ? if(response !=null) {
? ? ? ? ? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//獲取今日熱聞的數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?data.clear();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LatestNews news =newLatestNews();
? ? ? ? ? ? ? ? ? ? ? ? ? ? news.parseJson(newJSONObject(response));
? ? ? ? ? ? ? ? ? ? ? ? ? ? data.add(news.getDate());
? ? ? ? ? ? ? ? ? ? ? ? ? ? List items = news.getItems();
? ? ? ? ? ? ? ? ? ? ? ? ? ?data.addAll(items);
? ? ? ? ? ? ? ? ? ? ? ? ? date= news.getTime();
? ? ? ? ? ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged();
? ? ? ? ? ? ? ? ? ? ? ? ? swipe.setRefreshing(false);
? ? ? ? ? ? ? ? ? ? }catch(Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? }
}
},newResponse.ErrorListener() {
? ? ? ? ? @Override
? ? ? ? ? public voidonErrorResponse(VolleyError error) {
? ? ? ? ? ? ? ? ? ?Toast.makeText(context,"網絡好像不太好", Toast.LENGTH_SHORT).show();
? ? ? ? ?}
});
醬紫,問題就解決了。這個問題可以說很小白,我恰好也是個小白,所以犯了這個錯誤。希望這個文章能幫大家解決問題。