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();
}
}
Android ListView点击加载更多
最新推荐文章于 2021-05-27 11:11:44 发布