旧代码作废了,换成新的把,源码在 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看看

转载于:https://www.cnblogs.com/stay/archive/2011/08/22/2146134.html

Android ListView 下拉刷新 上拉更多[实例]相关推荐

  1. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...

    麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...

  2. Android滑动冲突解决方式(下拉刷新上拉加载更多,适配RecyclerView/ListView/ScrollView)

    一.Android事件的分发机制 这里需要了解下Andorid事件的分发机制.事件分发一般是针对一组事件,即ACTION_DOWN > ACTION_UP 或 ACTION_DOWN > ...

  3. Android ListView 实现下拉刷新上拉加载

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频 ...

  4. 开启Fluter基础之旅五-------ListView 3D滚动、Flipper效果、ListView下拉刷新上拉加载、ListView重排序...

    继续来来操练Flutter的基础,对于Flutter的学习也有一段时间了,实操项目还木有做过,所以待这次基础学完之后就打算用一个项目对之前所学的进行一下巩固,不然光学这些零散的知识点最终还是不会Flu ...

  5. Android自定义控件实战——实现仿IOS下拉刷新上拉加载 PullToRefreshLayout

    下拉刷新控件,网上有很多版本,有自定义Layout布局的,也有封装控件的,各种实现方式的都有.但是很少有人告诉你具体如何实现的,今天我们就来一步步实现自己封装的 PullToRefreshLayout ...

  6. Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这 ...

  7. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...

  8. react-native 自定义 下拉刷新 / 上拉加载更多 组件

    1.封装 Scroller 组件 src/components/Scroller/index.js /*** 下拉刷新/上拉加载更多 组件(Scroller)*/ import React, {Com ...

  9. listview下拉刷新上拉加载扩展(二)-仿美团外卖

    经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...

  10. listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖

    本篇是基于上篇listview下拉刷新上拉加载扩展(二)-仿美团外卖改造而来,主要调整了headview的布局,并加了两个背景动画,看似高大上,其实很简单: as源码地址:http://downloa ...

最新文章

  1. Nat. Mach. Intell. | 利用条件循环神经网络生成特定性质分子
  2. Kali Linux”下列签名无效“解决办法
  3. oracle mysql 效率_关于oracle 数据库效率的优化
  4. ITK:将itk :: CovariantVectors的点积
  5. DHCP+TFTP+VSFTP+pxelinux+kickstart实现RedHat的自动安装
  6. Dockerfile里的VOLUMES关键字
  7. 转答寒冬的面试题(1)
  8. java前台线程(普通线程) 和 后台线程
  9. python自动搜索请求失败_http请求 request失败自动重新尝试代码示例
  10. Elasticsearch 6.x 下载安装
  11. 带头节点循环链表实现队列
  12. python新手难点_初学两天python的操作难点总结
  13. shell脚本执行命令错误处理
  14. 下划线间隔数字 排序_面试必备:经典算法动画解析之希尔排序
  15. wordpress安装后勿忘删除install.php
  16. Eplan破解文件名称说明:
  17. 3D打印自动支撑算法
  18. 写给初学者:电气制图规范和图纸识读方法
  19. 全球最好听、最值得听的100首英文歌曲。(每首都有下载地址)
  20. 标准型微电脑酸碱度氧化还原电位控制器(UPH -100C)

热门文章

  1. Join a New Company
  2. 设计模式学习笔记(3)装饰器
  3. 10人勾结苹果外包公司员工窃个人信息 涉案900万
  4. Linux中/etc/init.d
  5. IOS之Autorotation and Autosizing
  6. 牛客网–华为机试在线训练8:合并表记录
  7. 拆散组合思路求解期望,方差
  8. 一道非齐次方程组解的判定习题--行向量
  9. Linux Qt入门:工程构建笔记一
  10. Pycharm在创建py文件时, 如何自动添加文件头注释?