您的位置:首页 > 移动开发 > Android开发

Android ListView 下拉刷新 上拉更多[实例]

2012-06-18 14:57 288 查看
今天得需求是做listview+上下拉动在header和footer显示progressdialog,但不影响用户操作

直接上代码,我已经加上注释了,自己看。

 

 



package com.stay.main;

import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.stay.wifi.R;

/**

 * @author Stay 

 * 动态加载listview数据,上拉 刷新,下拉 更多

 */
public class ListViewActivity extends Activity implements OnScrollListener {

    private static final int LOAD = 0;

    private static final int ERROR = 0;

    private static final int MEMBER = 1;

    private static final int LOADED = 2;

    private static final int DIALOG = 3;

    private static final int FULL = 4;

    private NearbyAdapter adapter;

    private ListView nearby_lv;

    private RelativeLayout nearby_lv_header;

    private Button list_bottom_btn;

    private LinearLayout list_bottom_linear;

    private TextView bottom_progress_text;

    private RelativeLayout nearby_lv_footer;

    private Button list_header_btn;

    private LinearLayout list_header_linear;

    private TextView heard_progress_text;

    private ArrayList<JSONObject> nearby_data = new ArrayList<JSONObject>();

    private int lastItem;

    private HashMap<String, Drawable> imageCache;

    private com.stay.main.ListViewActivity.MyHandler myHandler;

    private ProgressDialog dialog;

    private int curPage = 1;

    private boolean isMember = false;

    private int firstItem;

    public int count;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        initView();

        myHandler.sendEmptyMessage(LOAD);

    }

    @Override

    public void onScrollStateChanged(AbsListView view, int scrollState) {

        DebugUtil.debug("onScrollStateChanged");

        //当滚动停止且滚动的总数等于数据的总数,去加载
        if (lastItem == count && scrollState == SCROLL_STATE_IDLE) {

            DebugUtil.debug("onScrollStateChanged--------next");

            if (curPage == 4 && !isMember) {

                DebugUtil.show(this, "您不是正式会员,请申请正式会员,");

                list_bottom_linear.setVisibility(View.GONE);

            } else {

                //加载数据
                myHandler.sendEmptyMessage(LOAD);

            }

            return;

        }

        //当往上拉时更新数据,将data清空然后去重新加载
        if (firstItem == 0 && scrollState == SCROLL_STATE_IDLE) {

            DebugUtil.debug("onScrollStateChanged--------refresh");

            curPage = 0;

            myHandler.sendEmptyMessage(LOAD);

        }

    }

    @Override

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

        DebugUtil.debug("firstVisibleItem=" + firstVisibleItem);

        DebugUtil.debug("visibleItemCount=" + visibleItemCount);

        DebugUtil.debug("totalItemCount=" + totalItemCount);

        //这里要减二,因为我加了header footer
        lastItem = firstVisibleItem + visibleItemCount - 2;

        firstItem = firstVisibleItem;

    }

    public int getData() {

        try {

            HttpURLConnection conn = DownloadUtil.download(url//自己写咯);

            ArrayList<JSONObject> temp = JSONUtil.streamToJsonList(conn.getInputStream());

            if (curPage == 0 && nearby_data.size() > 0) {

                nearby_data.clear();

                count = 0;

            }

            if (temp != null && temp.size() > 0) {

                count += temp.size();

                nearby_data.addAll(temp);

                DebugUtil.debug("nearby_data.size()="+nearby_data.size());

            } else {

                return FULL;

            }

            return LOADED;

        } catch (Exception e) {

            return ERROR;

        }

    }

    private Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            switch (msg.what) {

            case DIALOG:

                list_bottom_linear.setVisibility(View.VISIBLE);

                list_header_linear.setVisibility(View.VISIBLE);

                break;

            case LOADED:

                list_bottom_linear.setVisibility(View.GONE);

                list_header_linear.setVisibility(View.GONE);

                curPage++;

                adapter.notifyDataSetChanged();

                break;

            case ERROR:

                DebugUtil.debug("error,missing data");

                break;

            case MEMBER:

                DebugUtil.debug("you must regist formal member");

                break;

            default:

                break;

            }

        }

    };
//创建子线程加载数据,然后更新
    private class MyHandler extends Handler {

        private int status;

        public MyHandler(Looper looper) {

            super(looper);

        }

        @Override

        public void handleMessage(Message msg) {

            synchronized (this) {

                switch (msg.what) {

                case LOAD:// get data from server
                    handler.sendEmptyMessage(DIALOG);//显示等待框
                    status = getData();

                    handler.sendEmptyMessageDelayed(status, 1000);

                    break;

                default:

                    break;

                }

            }

        }

    }

    public void initView() {

        imageCache = new HashMap<String, Drawable>();

        HandlerThread handlerThread = new HandlerThread("nearby");

        // 在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
        handlerThread.start();

        myHandler = new MyHandler(handlerThread.getLooper());

        nearby_lv = (ListView) findViewById(R.id.nearby_lv);

        nearby_lv_footer = (RelativeLayout) LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header, null);

        list_bottom_btn = (Button) nearby_lv_footer.findViewById(R.id.list_bottom_btn);

        list_bottom_linear = (LinearLayout) nearby_lv_footer.findViewById(R.id.list_bottom_linear);

        bottom_progress_text = (TextView) nearby_lv_footer.findViewById(R.id.progress_text);

        nearby_lv_header = (RelativeLayout) LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header, null);

        list_header_btn = (Button) nearby_lv_header.findViewById(R.id.list_bottom_btn);

        list_header_linear = (LinearLayout) nearby_lv_header.findViewById(R.id.list_bottom_linear);

        heard_progress_text = (TextView) nearby_lv_header.findViewById(R.id.progress_text);

        list_header_btn.setText("刷新");

        list_bottom_btn.setText("更多");

        list_header_linear.setVisibility(View.GONE);

        nearby_lv.addHeaderView(nearby_lv_header);

        nearby_lv.addFooterView(nearby_lv_footer);

        // list_header_btn.setOnClickListener(header_click);
        adapter = new NearbyAdapter(ListViewActivity.this, nearby_data);

        nearby_lv.setAdapter(adapter);

        nearby_lv.setOnScrollListener(ListViewActivity.this);

    }

}




 

核心部分就是这了,其他adapter,downloadUtil,debugUtil都在以前的帖子里,就不发了。

现在有最新版了。大家可以去http://www.stay4it.com/forum.php?mod=viewthread&tid=2&extra=page%3D1看看

Own Website:http://www.stay4it.com/

QQ:104816053
Android QQ Group: 点击加入

转载请注明出处http://stay.cnblogs.com/ 请尊重个人劳动成果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息