当前位置: 首页 > 编程笔记 >

ListView实现下拉刷新加载更多的实例代码(直接拿来用)

缪茂勋
2023-03-14
本文向大家介绍ListView实现下拉刷新加载更多的实例代码(直接拿来用),包括了ListView实现下拉刷新加载更多的实例代码(直接拿来用)的使用技巧和注意事项,需要的朋友参考一下

ListView Api bixu 好好看看

mNewsAdapter.notifyDataSetChanged();//刷新ListView

定义的RefreashListView

package com.itguang.dell_pc.myapplication.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.itguang.dell_pc.myapplication.R;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 作者: 小光哥 on 2016/7/7.
* 邮箱: 1445037803@qq.com
* 修订历史:
* 描述:
*         ┏┓   ┏┓
*        ┏┛┻━━━┛┻┓━━━━┻┓
*        ┃       ┃
*        ┃   ━   ┃
*        ┃ >   < ┃
*        ┃       ┃
*        ┃... ⌒ ... ┃
*        ┃       ┃
*        ┗━┓   ┏━┛
*          ┃   ┃ Code is far away from bug with the animal protecting
*          ┃ 史 ┃ 神兽保佑,代码无bug
*          ┃ 诗 ┃
*          ┃ 之 ┃
*          ┃ 宠 ┃
*          ┃   ┃
*          ┃   ┗━━━┓
*          ┃BUG天敌   ┣┓┣┓┣┓┣┓┣┓
*          ┃       ┏┛
*          ┗┓┓┏━┳┓┏┛
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛
*/
public class RefreshListView extends ListView implements AbsListView.OnScrollListener {
private static final int STATE_PULL_REFRESH = 0;// 下拉刷新
private static final int STATE_RELEASE_REFRESH = 1;// 松开刷新
private static final int STATE_REFRESHING = 2;// 正在刷新
private int mCurrrentState = STATE_PULL_REFRESH;// 当前状态
private View mHeaderView;
private TextView tvTitle;
private TextView tvTime;
private ProgressBar pbProgress;
private ImageView ivArrow;
private RotateAnimation animUp;
private RotateAnimation animDown;
private int startY = -1;// 滑动起点的y坐标
private int endY;
private int measuredHeight;
private int mFooterViewHeight;
private View footerView;
public RefreshListView(Context context) {
super(context);
initHeaderView();
initFooterView();
}
public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
initHeaderView();
initFooterView();
}
public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initHeaderView();
initFooterView();
}
/**
* 初始化头布局
*/
private void initHeaderView() {
mHeaderView = View.inflate(getContext(), R.layout.refeeash_header, null);
this.addHeaderView(mHeaderView);
tvTitle = (TextView) mHeaderView.findViewById(R.id.tv_title);
tvTime = (TextView) mHeaderView.findViewById(R.id.tv_time);
pbProgress = (ProgressBar) mHeaderView.findViewById(R.id.pb_progress);
ivArrow = (ImageView) mHeaderView.findViewById(R.id.iv_arr);
mHeaderView.measure(0, 0);//先测量再拿到它的高度
measuredHeight = mHeaderView.getMeasuredHeight();
mHeaderView.setPadding(0, -measuredHeight, 0, 0);
initArrowAnim();
tvTime.setText("最后刷新时间:" + getCurrentTime());
}
/**
* 初始化脚布局
*/
public void initFooterView() {
footerView = View.inflate(getContext(), R.layout.refreash_listview_footer, null);
this.addFooterView(footerView);
footerView.measure(0, 0);
mFooterViewHeight = footerView.getMeasuredHeight();
footerView.setPadding(0, -mFooterViewHeight, 0, 0);//默认隐藏脚布局
this.setOnScrollListener(this);
}
private boolean isLoadingMOre;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_FLING || scrollState == SCROLL_STATE_IDLE) {
if (getLastVisiblePosition() == getCount() - 1 && !isLoadingMOre) {//滑倒最后
System.out.println("到底了......");
footerView.setPadding(0, 0, 0, 0);
setSelection(getCount() - 1);//改变ListView的显示位置
isLoadingMOre = true;
if (mListener != null) {
mListener.onLoadMore();
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (startY == -1) {//有时候不会响应 MotionEvent.ACTION_DOWN 事件,这是要重新获取startY坐标
startY = (int) ev.getRawY();
}
//当正在刷新的时候,跳出循环,不再执行下面逻辑
if (mCurrrentState == STATE_RELEASE_REFRESH) {
break;
}
endY = (int) ev.getRawY();
int dy = endY - startY;//计算手指滑动距离
if (dy > 0 && getFirstVisiblePosition() == 0) {// 只有下拉并且当前是第一个item,才允许下拉
int padding = dy - measuredHeight;//计算padding
mHeaderView.setPadding(0, padding, 0, 0);//设置当前padding
if (padding > 0 && mCurrrentState != STATE_RELEASE_REFRESH) {
mCurrrentState = STATE_RELEASE_REFRESH;
refreshState();
} else if (padding < 0 && mCurrrentState != STATE_PULL_REFRESH) {// 改为下拉刷新状态
mCurrrentState = STATE_PULL_REFRESH;
refreshState();
}
return true;
}
break;
case MotionEvent.ACTION_UP:
startY = -1;//手指抬起重置
//当状态是松开刷新时抬起了手指,正在刷新
if (mCurrrentState == STATE_RELEASE_REFRESH) {
mCurrrentState = STATE_REFRESHING;// 正在刷新
mHeaderView.setPadding(0, 0, 0, 0);// 显示
refreshState();
} else if (mCurrrentState == STATE_PULL_REFRESH) {
mHeaderView.setPadding(0, -measuredHeight, 0, 0);// 隐藏
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
private String getCurrentTime() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = format.format(new Date());
return currentTime;
}
private void initArrowAnim() {
//初始化箭头动画
animUp = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animUp.setDuration(500);
animUp.setFillAfter(true);//保持状态
//箭头向下动画
animDown = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animDown.setDuration(500);
animDown.setFillAfter(true);
}
/**
* 刷新下拉控件的布局
*/
private void refreshState() {
switch (mCurrrentState) {
case STATE_PULL_REFRESH:
tvTitle.setText("下拉刷新");
ivArrow.setVisibility(View.VISIBLE);
pbProgress.setVisibility(View.INVISIBLE);
ivArrow.startAnimation(animDown);
break;
case STATE_RELEASE_REFRESH:
tvTitle.setText("松开刷新");
ivArrow.setVisibility(View.VISIBLE);
pbProgress.setVisibility(View.INVISIBLE);
ivArrow.startAnimation(animUp);
break;
case STATE_REFRESHING:
tvTitle.setText("正在刷新...");
ivArrow.clearAnimation();// 必须先清除动画,才能隐藏
ivArrow.setVisibility(View.INVISIBLE);
pbProgress.setVisibility(View.VISIBLE);
if (mListener != null) {
mListener.onRefreash();
}
break;
default:
break;
}
}
OnRefreashListener mListener;
public void setOnRefreashListener(OnRefreashListener listener) {
mListener = listener;
}
public interface OnRefreashListener {
void onRefreash();
void onLoadMore();
}
/**
* 收起下拉刷新的控件
*/
public void onRefreashComplete() {
if (isLoadingMOre) {
footerView.setPadding(0, -mFooterViewHeight, 0, 0);//隐藏脚布局
isLoadingMOre = false;
} else {
mCurrrentState = STATE_PULL_REFRESH;
tvTitle.setText("下拉刷新");
ivArrow.setVisibility(View.VISIBLE);
pbProgress.setVisibility(View.INVISIBLE);
mHeaderView.setPadding(0, -measuredHeight, 0, 0);//隐藏
}
}
public void noFooterView() {
footerView.setPadding(0, mFooterViewHeight, 0, 0);//隐藏脚布局
}
}

代码中引用RefreashListView

package com.itguang.dell_pc.myapplication.base;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.itguang.dell_pc.myapplication.R;
import com.itguang.dell_pc.myapplication.domain.NewsData;
import com.itguang.dell_pc.myapplication.domain.TabData;
import com.itguang.dell_pc.myapplication.globe.GlobeContents;
import com.itguang.dell_pc.myapplication.view.RefreshListView;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.viewpagerindicator.CirclePageIndicator;
import java.util.ArrayList;
/**
* 作者: 小光哥 on 2016/4/22.
* 邮箱: 1445037803@qq.com
* 修订历史:
* 描述:
*         ┏┓   ┏┓
*        ┏┛┻━━━┛┻┓━━━━┻┓
*        ┃       ┃
*        ┃   ━   ┃
*        ┃ >   < ┃
*        ┃       ┃
*        ┃... ⌒ ... ┃
*        ┃       ┃
*        ┗━┓   ┏━┛
*          ┃   ┃ Code is far away from bug with the animal protecting
*          ┃ 史 ┃ 神兽保佑,代码无bug
*          ┃ 诗 ┃
*          ┃ 之 ┃
*          ┃ 宠 ┃
*          ┃   ┃
*          ┃   ┗━━━┓
*          ┃BUG天敌   ┣┓┣┓┣┓┣┓┣┓
*          ┃       ┏┛
*          ┗┓┓┏━┳┓┏┛
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛
*/
/**
* 也签详情页
*/
public class TabDetailPager extends BaseMenuDetailPager implements ViewPager.OnPageChangeListener {
/**
* @param activity
* @param newsTabData
*/
NewsData.NewsTabData mTabdata;
private String mUrl;
private TabData mTabDetailData;
@ViewInject(R.id.vp_news)
private ViewPager mViewPager;
@ViewInject(R.id.lv_newslist)
private RefreshListView newsListView;//新闻列表
@ViewInject(R.id.tv_title)
private TextView tvTitle;//新闻标题
@ViewInject(R.id.indicator)
private CirclePageIndicator indicator;//头条新闻指示器
private ArrayList<TabData.TopNewsData> mTopNewsList;//新闻数据集合
private int[] images;
private ArrayList<TabData.TabNewsData> mNewsList;//新闻数据集合
private String mMoreUrl;
private NewsAdapter mNewsAdapter;
public TabDetailPager(Activity activity, NewsData.NewsTabData newsTabData) {
super(activity);
mTabdata = newsTabData;
mUrl = GlobeContents.SERVER_URL + mTabdata.url;
}
@Override
public View initViews() {
images = new int[]{R.drawable.topnews1, R.drawable.topnews21, R.drawable.topnews31, R.drawable.topimage};
View view = View.inflate(mActivity, R.layout.tab_detail_pager, null);
View headerView = View.inflate(mActivity, R.layout.list_header_topnews, null);//加载头布局
// TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
//事件注入
ViewUtils.inject(this, view);
ViewUtils.inject(this, headerView);
mViewPager.addOnPageChangeListener(this);
//将肥头条新闻以头布局形式加载到listView中
newsListView.addHeaderView(headerView);
//设置下拉刷新监听
newsListView.setOnRefreashListener(new RefreshListView.OnRefreashListener() {
@Override
public void onRefreash() {
getDataFromServer();
}
@Override
public void onLoadMore() {
if (mMoreUrl != null) {
getMoreDataFromServer();
} else {
Toast.makeText(mActivity, "没有更多数据了", Toast.LENGTH_SHORT).show();
newsListView.onRefreashComplete();
// newsListView.noFooterView();
}
}
});
return view;
}
@Override
public void initData() {
getDataFromServer();//这是一个异步的,
}
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = (String) responseInfo.result;
// System.out.println("页签详情页返回结果:+++++++++++++++++++" + result);
praseData(result, false);
newsListView.onRefreashComplete();
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(mActivity, "获取Tabdetaildata失败!", Toast.LENGTH_SHORT).show();
// error.printStackTrace();
}
});
}
/**
* 加载下一页数据
*/
private void getMoreDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = (String) responseInfo.result;
// System.out.println("页签详情页返回结果:+++++++++++++++++++" + result);
praseData(result, true);
newsListView.onRefreashComplete();
}
@Override
public void onFailure(HttpException e, String s) {
Toast.makeText(mActivity, "获取Tabdetaildata失败!", Toast.LENGTH_SHORT).show();
// error.printStackTrace();
}
});
}
/**
* 把json字符串解析成为json对象
*
* @param result 要解析的的json字符串
*/
private void praseData(String result, boolean isLoadMore) {
Gson gson = new Gson();
mTabDetailData = gson.fromJson(result, TabData.class);//返回TabData对象
System.out.println("页签详情页:+++++++++++++++++++++" + mTabdata);
//处理更多页面的逻辑
final String more = mTabDetailData.data.more;
if (!TextUtils.isEmpty(more)) {
mMoreUrl = GlobeContents.SERVER_URL + more;
} else {
mMoreUrl = null;
}
if (!isLoadMore) {
mTopNewsList = mTabDetailData.data.topnews;
mNewsList = mTabDetailData.data.news;
if (mTopNewsList != null) {
mViewPager.setAdapter(new TopNewsAdapter());
indicator.setOnPageChangeListener(this);
indicator.setViewPager(mViewPager);//在设置完适配器后,在设置指示器
indicator.setSnap(true);//设置快照显示
indicator.onPageSelected(0);//indicator会自作聪明,离开时会记录当前位置
tvTitle.setText(mTopNewsList.get(0).title);
}
mNewsAdapter = new NewsAdapter();
//填充新闻列表
if (mNewsList != null) {
newsListView.setAdapter(mNewsAdapter);
}
} else {//如果是加载下一页,需要将数据追加给原来的集合
ArrayList<TabData.TabNewsData> news = mTabDetailData.data.news;
mNewsList.addAll(news);
mNewsAdapter.notifyDataSetChanged();//刷新ListView
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {//更新头条新闻标题
TabData.TopNewsData topNewsData = mTopNewsList.get(position);
tvTitle.setText(topNewsData.title);
}
@Override
public void onPageScrollStateChanged(int state) {
}
/**
* ListView适配器
*/
class NewsAdapter extends BaseAdapter {
private final BitmapUtils utils;
NewsAdapter() {
utils = new BitmapUtils(mActivity);
utils.configDefaultLoadingImage(R.drawable.pic_item_list_default);
}
@Override
public int getCount() {
return mNewsList.size();
}
@Override
public Object getItem(int position) {
return mNewsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(mActivity, R.layout.list_news_item, null);
holder = new ViewHolder();
holder.ivPic = (ImageView) convertView.findViewById(R.id.iv_pic);
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
TabData.TabNewsData item = (TabData.TabNewsData) getItem(position);
holder.tvTitle.setText(item.title);
holder.tvDate.setText(item.pubdate);
utils.display(holder.ivPic, item.listimage);
return convertView;
}
}
static class ViewHolder {
public TextView tvTitle;
public TextView tvDate;
public ImageView ivPic;
}
/**
* Viewpager适配器
*/
class TopNewsAdapter extends PagerAdapter {
private BitmapUtils bitmapUtils;
TopNewsAdapter() {
bitmapUtils = new BitmapUtils(mActivity);
bitmapUtils.configDefaultLoadingImage(R.drawable.topnews_item_default);//设置默认图片
}
@Override
public int getCount() {
return mTabDetailData.data.topnews.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(mActivity);
imageView.setImageResource(images[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);//基于控件大小填充图片
// TabData.TopNewsData topNewsData = mTopNewsList.get(position);
// bitmapUtils.display(imageView,mTabDetailData.data.topnews.get(position).url);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
}

以上所述是小编给大家介绍的ListView实现下拉刷新加载更多的实例代码(直接拿来用)的全部叙述,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 本文向大家介绍Android ListView实现上拉加载更多和下拉刷新功能,包括了Android ListView实现上拉加载更多和下拉刷新功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1、ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新

  • 本文向大家介绍Android实现上拉加载更多以及下拉刷新功能(ListView),包括了Android实现上拉加载更多以及下拉刷新功能(ListView)的使用技巧和注意事项,需要的朋友参考一下 首先为大家介绍Andorid5.0原生下拉刷新简单实现。 先上效果图; 相对于上一个19.1.0版本中的横条效果好看了很多。使用起来也很简单。 几行代码就可以实现下拉刷新,效果也还不错,不用引入第三方ja

  • 本文向大家介绍Android中Listview下拉刷新和上拉加载更多的多种实现方案,包括了Android中Listview下拉刷新和上拉加载更多的多种实现方案的使用技巧和注意事项,需要的朋友参考一下  listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明。      方案一:添加头布局和脚布局         android系统为listview提供了addf

  • 本文向大家介绍vue2.0 移动端实现下拉刷新和上拉加载更多的示例,包括了vue2.0 移动端实现下拉刷新和上拉加载更多的示例的使用技巧和注意事项,需要的朋友参考一下 本人正在基于 vue2.0 + webpack + es6 搭建前端架构,整理了部分插件,下面这个是下拉更新 上拉更多的,挺好用的,分享给大家。 直接上代码,不懂的多看几遍,下面我换会告诉大家如何使用。 把上面组件拷贝一下,存成后缀

  • 本文向大家介绍Android ExpandableListView实现下拉刷新和加载更多效果,包括了Android ExpandableListView实现下拉刷新和加载更多效果的使用技巧和注意事项,需要的朋友参考一下 支持下拉刷新和加载更多的ExpandableListView,供大家参考,具体内容如下 模拟器有点卡,滑动的时候鼠标不方便 怎么用: XML中声明 UI中配置下拉刷新的回调以及是否

  • 本文向大家介绍php+jquery+html实现点击不刷新加载更多的实例代码,包括了php+jquery+html实现点击不刷新加载更多的实例代码的使用技巧和注意事项,需要的朋友参考一下 基本原理:页面载入时,jQuery向后台请求数据,PHP通过查询数据库将最新的几条记录显示在列表页,在列表页的底部有个“更多”链接,通过触发该链接,向服务端发送Ajax请求,后台PHP程序得到请求参数,并作出相应

  • 本文向大家介绍H5基于iScroll实现下拉刷新和上拉加载更多,包括了H5基于iScroll实现下拉刷新和上拉加载更多的使用技巧和注意事项,需要的朋友参考一下 前言       前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据而已,上拉是追加数据。 使用

  • 本文向大家介绍jQuery实现下拉加载功能实例代码,包括了jQuery实现下拉加载功能实例代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所示: 以上代码是小编给大家分享的jQuery实现下拉加载功能实例代码,希望对大家有所帮助!