14、自定义ListView

[size=medium] 实现了显示的效果,接着来实现一些监听器(接口),下拉刷新、上拉加载、Item划出屏幕(之后会用到)等监听器(接口),定义两个接口:[/size]

public interface QRecyclerListener{
void onMovedToScrapHeap(View view);//Item划出屏幕回调函数
}
public void setQRecyclerListener(QRecyclerListener listener){//设置
this.rclistener=listener;
}

public interface QPullListener{
void onRefresh();//下拉刷新回调函数
void onLoad();//上拉加载回调函数
}
public void setQPullListener(QPullListener listener){//设置
this.pulllistener=listener;
}

[size=medium] 只需在需要的地方调用pulllistener.onRefresh();(或其他),如上节触摸事件中调用下拉刷新。
上拉加载则是当页面滑动时,判断是否快要到达页面结束,并调用pulllistener.onLoad();,为此CListView需要实现OnScrollListener接口,并实现其方法。

实现OnScrollListener接口[/size]
private class CListView extends ListView implements OnScrollListener


[size=medium] 实现两个方法[/size]
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if(firstVisibleItem+visibleItemCount>=totalItemCount&&!isLoad&&pulllistener!=null){
pulllistener.onLoad();
isLoad=true;//是否正在加载的一个标志
}
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub

}

[size=medium] Item划出屏幕的接口,实现RecyclerListener接口[/size]
private class CListView extends ListView implements OnScrollListener, RecyclerListener

[size=medium] 实现一个方法[/size]
@Override
public void onMovedToScrapHeap(View view) {
// TODO Auto-generated method stub
if(rclistener!=null&&getFirstVisiblePosition()>1){
rclistener.onMovedToScrapHeap(view);
}
}


[size=medium] 添加刷新完成、加载完成,恢复初始状态的函数[/size]

public void completeRefresh(int state){
iv_refresh.clearAnimation();//停止动画
rl_refresh.setPadding(0, -iv_refresh.getHeight(), 0, 0);
clv_list.isRefresh=false;
}
public void completeLoad(int state){
clv_list.isLoad=false;
}

[size=medium] 附上变量定义及动画Xml[/size]

private ImageView iv_refresh;//刷新提示图标
private RelativeLayout rl_refresh;//图标父布局,通过改变Padding改变图标位置
private Animation anim_rotate;//刷新时的旋转动画

private CListView clv_list;//内部定义CListView继承自ListView
private QRecyclerListener rclistener;//内部Item划出屏幕监听器
private QPullListener pulllistener;//刷新加载监听器

[size=medium] 旋转动画
res/anim下新建动画文件anim_rotate_round.xml[/size]

<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="720"
android:duration="1080"
android:repeatCount="-1"
android:pivotX="50%"
android:pivotY="50%" >
</rotate>


[size=medium] 测试效果ListFragment中[/size]

private void initListener(){
adapter=new ListAdapter(getActivity(),qlv_list);
qlv_list.setAdapter(adapter);

qlv_list.setQPullListener(qplistener);
}

private QPullListener qplistener=new QPullListener() {

@Override
public void onRefresh() {
// TODO Auto-generated method stub
qlv_list.completeRefresh(0);
System.out.println("刷新");
}

@Override
public void onLoad() {
// TODO Auto-generated method stub
qlv_list.completeLoad(0);
System.out.println("加载");
};
}

[img]http://dl2.iteye.com/upload/attachment/0125/1762/aefe12bc-7ebc-357e-b545-b330ae397106.gif[/img]
[color=gray][size=medium]注:懒了,好多图都用的一个,看输出信息是否有相应文字[/size][/color]

[align=right][size=medium]始终相信——2017/05/16[/size][/align]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值