Android 上拉刷新列表數據

cymt 9年前發布 | 2K 次閱讀 Java Android

   android開發中,listview是最常用的控件之一,通常我們可以再微博、微信等很多應用里面都可以看到下拉刷新,以及上拉刷新,點擊查看更多等功能。這里介紹下說下上拉刷新。
  上拉刷新其實和底部的“點擊加載更多”的功能差不多。都是分頁加載數據的一個實現。具體是去監聽滾動條事件,下拉到底部時進行操作。
這里直接上代碼
 

package com.xzw.demo;

import java.util.ArrayList; import java.util.HashMap; import java.util.List;

import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener {

    private static final String TAG = "MainActivity";

    private ListView listView;
    private View moreView; //加載更多頁面

    private SimpleAdapter adapter;
    private ArrayList<HashMap<String, String>> listData;

    private int lastItem;
private int count;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView)findViewById(R.id.listView);
    moreView = getLayoutInflater().inflate(R.layout.load, null);
    listData = new ArrayList<HashMap<String,String>>();

    prepareData(); //準備數據
    count = listData.size();

    adapter = new SimpleAdapter(this, listData,R.layout.item, 
                    new String[]{"itemText"}, new int[]{R.id.itemText});

    listView.addFooterView(moreView); //添加底部view,一定要在setAdapter之前添加,否則會報錯。

    listView.setAdapter(adapter); //設置adapter
    listView.setOnScrollListener(this); //設置listview的滾動事件
}


private void prepareData(){  //準備數據
        for(int i=0;i<10;i++){
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("itemText", "測試數據"+i);
                listData.add(map);
        }

}

private void loadMoreData(){ //加載更多數據
         count = adapter.getCount(); 
        for(int i=count;i<count+5;i++){
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("itemText", "測試數據"+i);
                listData.add(map);
        }
        count = listData.size();
}


    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {

            Log.i(TAG, "firstVisibleItem="+firstVisibleItem+"\nvisibleItemCount="+
                            visibleItemCount+"\ntotalItemCount"+totalItemCount);

            lastItem = firstVisibleItem + visibleItemCount - 1;  //減1是因為上面加了個addFooterView

    }


    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
            Log.i(TAG, "scrollState="+scrollState);
            //下拉到空閑是,且最后一個item的數等于數據的總數時,進行更新
            if(lastItem == count  && scrollState == this.SCROLL_STATE_IDLE){ 
                    Log.i(TAG, "拉到最底部");
                    moreView.setVisibility(view.VISIBLE);

                mHandler.sendEmptyMessage(0);

            }

    }
    //聲明Handler
    private Handler mHandler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                    switch (msg.what) {
                    case 0:

                            try {
                                    Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                            }
                        loadMoreData();  //加載更多數據,這里可以使用異步加載
                        adapter.notifyDataSetChanged();
                        moreView.setVisibility(View.GONE); 

                        if(count > 30){
                                Toast.makeText(MainActivity.this, "木有更多數據!", 3000).show();
                              listView.removeFooterView(moreView); //移除底部視圖
                        }
                            Log.i(TAG, "加載更多數據");
                            break;
        case 1:

                            break;
                    default:
                            break;
                    }
            };
    };

} </pre>

代碼:

 本文由用戶 cymt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!