14、自定义ListView
程序员文章站
2022-03-11 11:24:40
...
实现了显示的效果,接着来实现一些监听器(接口),下拉刷新、上拉加载、Item划出屏幕(之后会用到)等监听器(接口),定义两个接口:
只需在需要的地方调用pulllistener.onRefresh();(或其他),如上节触摸事件中调用下拉刷新。
上拉加载则是当页面滑动时,判断是否快要到达页面结束,并调用pulllistener.onLoad();,为此CListView需要实现OnScrollListener接口,并实现其方法。
实现OnScrollListener接口
实现两个方法
Item划出屏幕的接口,实现RecyclerListener接口
实现一个方法
添加刷新完成、加载完成,恢复初始状态的函数
附上变量定义及动画Xml
旋转动画
res/anim下新建动画文件anim_rotate_round.xml
测试效果ListFragment中
注:懒了,好多图都用的一个,看输出信息是否有相应文字
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; }
只需在需要的地方调用pulllistener.onRefresh();(或其他),如上节触摸事件中调用下拉刷新。
上拉加载则是当页面滑动时,判断是否快要到达页面结束,并调用pulllistener.onLoad();,为此CListView需要实现OnScrollListener接口,并实现其方法。
实现OnScrollListener接口
private class CListView extends ListView implements OnScrollListener
实现两个方法
@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 }
Item划出屏幕的接口,实现RecyclerListener接口
private class CListView extends ListView implements OnScrollListener, RecyclerListener
实现一个方法
@Override public void onMovedToScrapHeap(View view) { // TODO Auto-generated method stub if(rclistener!=null&&getFirstVisiblePosition()>1){ rclistener.onMovedToScrapHeap(view); } }
添加刷新完成、加载完成,恢复初始状态的函数
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; }
附上变量定义及动画Xml
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;//刷新加载监听器
旋转动画
res/anim下新建动画文件anim_rotate_round.xml
<?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>
测试效果ListFragment中
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("加载"); }; }
注:懒了,好多图都用的一个,看输出信息是否有相应文字
始终相信——2017/05/16