- 浏览: 7768 次
- 性别:
- 来自: 广州
文章分类
最新评论
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 请尊重个人劳动成果。
今天得需求是做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 调用图库选择图片实现和参数详解
2014-07-09 14:08 0Android 调用图库选择图片实现和参数详解 ... -
Android中PopupWindow中有输入框时无法弹出输入法的解决办法
2014-07-09 14:06 0PopupWindow window=new PopupWi ... -
Android 侧滑(双向滑动菜单)效果
2014-07-09 14:01 1108下面看看我们如何使用它,达到我们想要的效果 public c ... -
Android中ListView分页加载数据
2014-07-09 13:53 722public class MainActivity exten ... -
listView滑动刷新代码(分页功能)
2014-07-09 11:07 764这三个代码都是从网上下载来的,但是导入到eclipse里面以后 ... -
OnScrollListener回调分析
2014-07-09 11:03 418如果adapter中的数据量很 ... -
Android 图片平铺效果bitmap
2014-05-23 22:02 6211)第一种利用系统提供的api实现 view sour ... -
文本框的类型和进度条设置的样式
2014-05-21 14:53 1324http://www.technotalkative.com/ ... -
在应用程序使用android google搜索功能
2014-05-21 14:12 445try { Intent intent = n ... -
TextView添加下划线
2014-05-21 14:09 521SpannableString contentUnderl ...
相关推荐
(网上的很多下拉刷新上拉更多 都会和长按菜单事件冲突) 控件都封装好了 你们不用再费劲力气去写啥了 直接写好OnMore方法 和OnRefresh方法 就OK了 而且控件很灵活 可以让你有选择的使用上拉刷新 或者上拉更多 我有...
4. 性能优化:对于大数据量的列表,可以使用ViewHolder模式减少视图复用的开销,或者使用ListView的HeaderView和FooterView来实现下拉刷新和上拉加载的界面。 总结,下拉刷新和上拉加载是Android应用中常见的功能,...
总之,下拉刷新和上拉加载更多是提升Android应用用户体验的关键特性,通过合理使用开源库和自定义事件监听,可以轻松地在ListView中实现这些功能。开发者可以根据项目需求选择合适的库,或者自定义实现,以满足各种...
这就是“android listview下拉刷新上拉加载更多改良版”所解决的问题。 下拉刷新(Pull-to-Refresh)功能让用户可以通过手势向下拉动列表来更新数据,而上拉加载更多(Load More)则允许用户在滚动到底部时加载更多...
比如,XListView是一个非常受欢迎的Android下拉刷新和上拉加载更多库,它包含在你提供的压缩包文件"XListView-Android-master"中。 XListView的使用步骤如下: 1. 引入库:在项目级build.gradle文件中添加XListView...
"Android Listview下拉刷新上拉加载源码"这个资源可能包含了实现这些功能的具体代码示例。 下拉刷新功能允许用户通过手势向下拉动ListView的顶部来更新列表内容,通常用于获取最新数据。这种功能的实现通常依赖于第...
标题提到的"android listView下拉刷新 上拉加载 分开",意味着它提供了三个独立的示例,分别针对下拉刷新和上拉加载功能进行实现。下面我们将详细探讨这些知识点。 1. **下拉刷新(Pull-to-Refresh)** 下拉刷新功能...
总的来说,自定义ListView下拉刷新和上拉加载更多虽然涉及到一些复杂的交互逻辑,但通过合理的设计和第三方库,可以大大简化开发过程。在实际项目中,可以根据需求选择自定义实现或者利用已有的解决方案,以提供更好...
本Demo "Android ListView下拉刷新 Demo.rar" 主要是为了展示如何在ListView中实现下拉刷新功能,帮助开发者更好地理解和实践这一功能。 首先,我们要理解下拉刷新的基本概念。下拉刷新,顾名思义,是指用户在...
上拉加载更多(Infinite Scroll)通常与分页加载结合,当用户滚动到ListView底部时,自动加载更多数据。实现这一功能需要监听ListView的滚动事件,并判断是否到达底部。可以自定义ListView的OnScrollListener: ```...
以上就是关于“Android ListView下拉刷新、动态加载数据及图文混排”的实现步骤。通过这个功能,用户可以在滚动到列表底部时加载更多内容,而下拉刷新则允许用户获取最新的数据,提高了用户体验。
"完美的ListView下拉刷新上拉加载实例Demo"就是一个这样的示例项目,它旨在帮助开发者理解和实现这种交互模式。 下拉刷新(Pull-to-Refresh)功能允许用户通过在ListView顶部向下拉动来更新列表内容,通常用于获取...
综上所述,Android ListView的下拉刷新和上拉加载更多功能是现代移动应用中不可或缺的组件,它们提升了用户体验,使得数据更新和加载更加便捷。开发者可以通过多种方式实现这些功能,但需要注意性能优化和用户体验的...
这个"Android listView下拉刷新上拉刷新带阻尼效果"的源码Demo是几年前的一个示例,旨在帮助学生理解和实现Android应用中的下拉刷新和上拉加载更多功能,同时加入了阻尼效果,提升用户体验。阻尼效果是指在用户滑动...
同时也将GitHub上的一个开源的下拉刷新,上拉加载的ListView稍稍改良了一下! 原始代码地址:https://github.com/Maxwin-z/XListView-Android 问题和改进: 问题:当最开始数据不能撑满屏幕的时候,也就是比如有1...
综上所述,实现Android ListView的下拉刷新功能需要结合布局设计、触摸事件监听以及数据更新。使用官方的SwipeRefreshLayout库可以简化这一过程,但也可以根据需求自定义实现,以获得更灵活的控制。通过以上步骤,你...
本节将深入探讨如何在Android中实现ListView的下拉刷新功能。 一、SwipeRefreshLayout Android SDK提供了一个名为SwipeRefreshLayout的组件,它是实现下拉刷新的标准方式。SwipeRefreshLayout可以包裹一个子View,...
总结来说,"android listview 下拉刷新 上拉加载整合"是Android开发中提升用户体验的重要技术点,通过使用开源库或自定义实现,我们可以为ListView添加这两种功能,提高应用的交互性和功能性。对于初学者,理解并...
总结起来,自定义ListView下拉刷新和上拉加载更多是提升Android应用性能和用户体验的重要手段。通过自定义组件,开发者可以灵活地设计交互和视觉效果,更好地匹配应用的整体设计。理解并掌握这种自定义实现方法对于...