zoukankan      html  css  js  c++  java
  • Android ListView 下拉刷新 上拉更多[实例]

    旧代码作废了,换成新的把,源码在 http://www.stay4it.com/?p=245

    今天得需求是做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看看

  • 相关阅读:
    jquery.validate验证表单配合回调提交和h5.storage本地保存笔记
    datetimepicker时间控件
    画图工具除了echarts我使用highcharts
    jquery.bootpag分页控件
    时间插件--做到前几个月和后个几月的设置
    websocket小荔枝
    jquery请求解析xml
    【leetcode】Combinations
    【leetcode】Balanced Binary Tree
    【leetcode刷题笔记】Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/stay/p/2146134.html
Copyright © 2011-2022 走看看