Android ListView点击加载更多

package com.test.android.view.myview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.test.android.R;

/**
 * @类名:RefreshListView
 * @功能描述:点击加载更多ListView<br> <br>
 *                          使用说明:<li>设置监听listView.setOnRefreshDataListener(new
 *                          OnRefreshListener() {<br>
 *                          public void startRefresh() { <br>
 *                          listView.pager++;(页数+1)<br>
 *                          此句话执行加载数据的方法<br>
 *                          public void notifyData() {<br>
 *                          adapter.notifyDataChanged();(完成则刷新数据) <br>
 *                          , 每页的条目);<br> <li>数据加载完毕,调用方法finishRefreshData().<br>
 *                          用来通知ListView加载数据完成<br> <li>
 *                          如要初始化ListView(如下拉刷新,联网恢复重新获得数据等),
 *                          可调用方法reSetListView()
 * @作者:XuanKe'Huang
 * @时间:2014-11-21 下午8:14:54
 * @Copyright 2014
 */
@SuppressLint({ "InflateParams", "HandlerLeak" })
@SuppressWarnings("static-access")
public class RefreshListView extends ListView {

	public RefreshListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context);
	}

	public RefreshListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public RefreshListView(Context context) {
		super(context);
		init(context);
	}

	/**
	 * 方法名: init
	 * 
	 * 功能描述:初始化
	 * 
	 * @param context
	 *            上下文对象
	 * @return void
	 * 
	 *         </br>throws
	 */
	private void init(Context context) {
		this.context = context;
		layoutInflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		showRefreshView();// 初始化时为ListView添加一个尾部布局,用做刷新布局
	}

	private Context context;// 上下文对象
	private LayoutInflater layoutInflater;
	private View view;
	private ImageView refreshImageView;// 刷新图片
	private TextView refershTextView;// 刷新文字提示
	private OnRefreshListener onRefreshListener;// 刷新监听器
	public static int pager = 0, page_count = 0;// 页码,每页的数目
	private boolean ifRefreshIng = false;// 是否正在刷新
	private boolean stop = false;// 是否停止动画

	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 10088:// 刷新完成,停止转圈圈动画
				refreshImageView.clearAnimation();
				stop = true;
			case 10087:// 正在刷新,启动转圈圈动画
				if (!stop) {
					Animation animation = new RotateAnimation(0, 360,
							Animation.RELATIVE_TO_SELF, 0.5f,
							Animation.RELATIVE_TO_SELF, 0.5f);
					animation.setDuration(3000);
					refreshImageView.startAnimation(animation);
					handler.sendEmptyMessageDelayed(10087, 2800);
				}
				break;
			}

		};
	};

	/**
	 * 方法名: setOnRefreshDataListener
	 * 
	 * 功能描述:设置数据刷新监听
	 * 
	 * @param onRefreshListener
	 *            刷新监听
	 * @param pager
	 *            页数
	 * @param pager_count
	 *            每页的条目
	 * @return void
	 * 
	 *         </br>throws
	 */
	public void setOnRefreshDataListener(OnRefreshListener onRefreshListener,
			int pager_count) {
		this.onRefreshListener = onRefreshListener;
		this.page_count = pager_count;
	}

	/**
	 * 方法名: finishRefreshData
	 * 
	 * 功能描述:刷新完成调用
	 * 
	 * @param count
	 *            list的大小.推荐传入:list.size()
	 * @return void
	 * 
	 *         </br>throws
	 */
	public void finishRefreshData(int count) {
		dismissRefreshView(count);
	}

	/**
	 * 方法名: reSetListView
	 * 
	 * 功能描述:重新设置ListView(回归初始状态).当有下拉刷新,或重新联网情况下可调用
	 * 
	 * @return void
	 * 
	 *         </br>throws
	 */
	public void reSetListView() {
		showRefreshView();
	}

	/**
	 * 方法名: showRefreshView
	 * 
	 * 功能描述:显示刷新View
	 * 
	 * @return void
	 * 
	 *         </br>throws
	 */
	private void showRefreshView() {
		if (view == null) {// 如果刷新布局不存在,加加载刷新布局
			view = layoutInflater.inflate(R.layout.item_refreshlistview, null);
			refreshImageView = (ImageView) view
					.findViewById(R.id.imageview_refresh_icon);
			refershTextView = (TextView) view
					.findViewById(R.id.textview_refersh_text);

			view.setOnClickListener(new OnClickListener() {// 刷新布局监听
				@Override
				public void onClick(View v) {
					if (ifRefreshIng) {// 如果是正在刷新,则不可刷新
						return;
					} else {
						ifRefreshIng = true;// 把状态改为正在加载数据
						refreshImageView.setImageResource(R.drawable.dengdai);// 修改显示图片
						refershTextView.setText("正在刷新...");// 修改提示文字
						onRefreshListener.startRefresh();// 调用加载数据方法
						stop = true;// 把是否开启动画变为ture
						handler.sendEmptyMessage(10087);// 开启动画
					}
				}
			});
		}
		view.setVisibility(View.VISIBLE);// 设置刷新布局为可见
		RefreshListView.this.addFooterView(view);// 把刷新布局添加到ListView最底部
	}

	/**
	 * 方法名: dismissRefreshView
	 * 
	 * 功能描述:隐藏刷新View
	 * 
	 * @param count
	 *            当前适配器中的list的大小
	 * @return void
	 * 
	 *         </br>throws
	 */
	private void dismissRefreshView(int count) {
		ifRefreshIng = false;// 把是否正在刷新标志变为false,表示可以刷新
		handler.sendEmptyMessage(10088);// 停止转圈动画
		if (count < pager * this.page_count) {// 如果没有更多数据了
			if (view != null) {// 隐藏刷新界面,提示已无更多数据
				RefreshListView.this.removeFooterView(view);
				view.setVisibility(View.GONE);
				Toast.makeText(context, "已无更多数据", Toast.LENGTH_SHORT).show();
			}
		} else {// 有更多数据仍可加载
			if (view != null) {
				refreshImageView.setImageResource(R.drawable.dianji);
				refershTextView.setText("点击加载更多");
			}
		}
		onRefreshListener.notifyData();// 调用刷新数据方法
	}

	public interface OnRefreshListener {
		/**
		 * 方法名: startRefresh
		 * 
		 * 功能描述:开始刷新数据
		 * 
		 * @return void
		 * 
		 *         </br>throws
		 */
		void startRefresh();

		/**
		 * 方法名: notifyData
		 * 
		 * 功能描述:刷新界面,可在次数调用notifyDataChanged()方法
		 * 
		 * @return void
		 * 
		 *         </br>throws
		 */
		void notifyData();
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值