`
声动天下
  • 浏览: 7710 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android ListView 下拉刷新 上拉更多

 
阅读更多
Android ListView 下拉刷新 上拉更多[实例]
今天得需求是做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("http://zdevl.mapi.jjdd.com/nearby/lbs?page=" + curPage);
            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都在以前的帖子里,就不发了。
有问题的可以直接留言,或者加qq或加群:19370204

Own Blog:http://www.stayalways.com/
QQ:104816053
Android QQ Group:19370204
转载请注明出处http://stay.cnblogs.com 请尊重个人劳动成果。
分享到:
评论

相关推荐

    android listview下拉刷新上拉更多

    (网上的很多下拉刷新上拉更多 都会和长按菜单事件冲突) 控件都封装好了 你们不用再费劲力气去写啥了 直接写好OnMore方法 和OnRefresh方法 就OK了 而且控件很灵活 可以让你有选择的使用上拉刷新 或者上拉更多 我有...

    Android ListView 下拉刷新、上拉加载

    4. 性能优化:对于大数据量的列表,可以使用ViewHolder模式减少视图复用的开销,或者使用ListView的HeaderView和FooterView来实现下拉刷新和上拉加载的界面。 总结,下拉刷新和上拉加载是Android应用中常见的功能,...

    android Listview下拉刷新 上拉(滑动分页)加载更多

    总之,下拉刷新和上拉加载更多是提升Android应用用户体验的关键特性,通过合理使用开源库和自定义事件监听,可以轻松地在ListView中实现这些功能。开发者可以根据项目需求选择合适的库,或者自定义实现,以满足各种...

    android listview下拉刷新上拉加载更多改良版

    这就是“android listview下拉刷新上拉加载更多改良版”所解决的问题。 下拉刷新(Pull-to-Refresh)功能让用户可以通过手势向下拉动列表来更新数据,而上拉加载更多(Load More)则允许用户在滚动到底部时加载更多...

    android listview 下拉刷新 上拉翻页 仿新浪微博客户端

    比如,XListView是一个非常受欢迎的Android下拉刷新和上拉加载更多库,它包含在你提供的压缩包文件"XListView-Android-master"中。 XListView的使用步骤如下: 1. 引入库:在项目级build.gradle文件中添加XListView...

    Android Listview下拉刷新上拉加载源码

    "Android Listview下拉刷新上拉加载源码"这个资源可能包含了实现这些功能的具体代码示例。 下拉刷新功能允许用户通过手势向下拉动ListView的顶部来更新列表内容,通常用于获取最新数据。这种功能的实现通常依赖于第...

    android listView下拉刷新 上拉加载 分开

    标题提到的"android listView下拉刷新 上拉加载 分开",意味着它提供了三个独立的示例,分别针对下拉刷新和上拉加载功能进行实现。下面我们将详细探讨这些知识点。 1. **下拉刷新(Pull-to-Refresh)** 下拉刷新功能...

    自定义listview下拉刷新上拉加载更多以及与google官方的下拉刷新结合使用

    总的来说,自定义ListView下拉刷新和上拉加载更多虽然涉及到一些复杂的交互逻辑,但通过合理的设计和第三方库,可以大大简化开发过程。在实际项目中,可以根据需求选择自定义实现或者利用已有的解决方案,以提供更好...

    Android ListView下拉刷新 Demo.rar

    本Demo "Android ListView下拉刷新 Demo.rar" 主要是为了展示如何在ListView中实现下拉刷新功能,帮助开发者更好地理解和实践这一功能。 首先,我们要理解下拉刷新的基本概念。下拉刷新,顾名思义,是指用户在...

    android下拉刷新+上拉加载+滑动删除的ListView

    上拉加载更多(Infinite Scroll)通常与分页加载结合,当用户滚动到ListView底部时,自动加载更多数据。实现这一功能需要监听ListView的滚动事件,并判断是否到达底部。可以自定义ListView的OnScrollListener: ```...

    android listview 下拉刷新 动态加载数据 图文混排

    以上就是关于“Android ListView下拉刷新、动态加载数据及图文混排”的实现步骤。通过这个功能,用户可以在滚动到列表底部时加载更多内容,而下拉刷新则允许用户获取最新的数据,提高了用户体验。

    完美的ListView下拉刷新上拉加载实例Demo

    "完美的ListView下拉刷新上拉加载实例Demo"就是一个这样的示例项目,它旨在帮助开发者理解和实现这种交互模式。 下拉刷新(Pull-to-Refresh)功能允许用户通过在ListView顶部向下拉动来更新列表内容,通常用于获取...

    Android listview 下拉刷新和下拉刷新及加载更多

    综上所述,Android ListView的下拉刷新和上拉加载更多功能是现代移动应用中不可或缺的组件,它们提升了用户体验,使得数据更新和加载更加便捷。开发者可以通过多种方式实现这些功能,但需要注意性能优化和用户体验的...

    Android listView下拉刷新上拉刷新带阻尼效果-IT计算机-毕业设计.zip

    这个"Android listView下拉刷新上拉刷新带阻尼效果"的源码Demo是几年前的一个示例,旨在帮助学生理解和实现Android应用中的下拉刷新和上拉加载更多功能,同时加入了阻尼效果,提升用户体验。阻尼效果是指在用户滑动...

    Android ListView下拉刷新、上拉载入更多 下拉刷新

    同时也将GitHub上的一个开源的下拉刷新,上拉加载的ListView稍稍改良了一下! 原始代码地址:https://github.com/Maxwin-z/XListView-Android 问题和改进: 问题:当最开始数据不能撑满屏幕的时候,也就是比如有1...

    android listview下拉刷新代码

    综上所述,实现Android ListView的下拉刷新功能需要结合布局设计、触摸事件监听以及数据更新。使用官方的SwipeRefreshLayout库可以简化这一过程,但也可以根据需求自定义实现,以获得更灵活的控制。通过以上步骤,你...

    Android listview 下拉刷新

    本节将深入探讨如何在Android中实现ListView的下拉刷新功能。 一、SwipeRefreshLayout Android SDK提供了一个名为SwipeRefreshLayout的组件,它是实现下拉刷新的标准方式。SwipeRefreshLayout可以包裹一个子View,...

    android listview 下拉刷新 上拉加载整合

    总结来说,"android listview 下拉刷新 上拉加载整合"是Android开发中提升用户体验的重要技术点,通过使用开源库或自定义实现,我们可以为ListView添加这两种功能,提高应用的交互性和功能性。对于初学者,理解并...

    自定义listView下拉刷新上拉加载更多

    总结起来,自定义ListView下拉刷新和上拉加载更多是提升Android应用性能和用户体验的重要手段。通过自定义组件,开发者可以灵活地设计交互和视觉效果,更好地匹配应用的整体设计。理解并掌握这种自定义实现方法对于...

Global site tag (gtag.js) - Google Analytics