易生活(五)-APP--上拉加载更多工具类封装思路及实现
代码封装,代码的灵活运用,继承,接口,回调2016-06-03
- 在项目开发过程中遇到这样一个问题:我们团队有用到RecyclerView,由于这是新特性,许多刷新框架还不支持,于是就选择了google官方的刷新框架SwipeRefreshLayout,但是这个框架只有下拉刷新,没有上拉加载更多。
- 在《ListView刷新原理及实现》已经说过自己动手写刷新以及加载原理,于是项目中打算自己写上拉加载更多,刷新用SwipeRefreshLayout。
- 问题是,自己写上拉加载更多会用到大量的代码去实现这个逻辑,非常繁琐。
- 现尝试对这一块进行封装。[已解决]
new xxx(传递子类对象通知父类)
)。我们通过super.init(子类对象)
去通知父类。工具类
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.AbsListView;
/**
* Created by wgyscsf on 2016/6/1.
* 邮箱:wgyscsf@163.com
* 博客:http://blog.csdn.net/wgyscsf
*/
/**
* 作用:该工具类简化了滑到底部的逻辑判断以及何时触发上拉加在更多;可以直接写上拉加载更多操作。(简单来说,你不用再去写何时到listview的底部这一块的操作以及发送加载更多的handler请求)
* 使用方式(三步):
* 1、让你的activity继承这个LoadMoreActivity(不再继承原有AppCompatActivity)
* 2、在你的onCreate方法中写 super.initLoadMore(this);
* 3、让你的activity实现LoadMoreActivity.LoadMoreActivityListener接口,在实现的方法中即可以写上拉加载更多的操作(自己维护页码变化)。
* 注意:原有操作不便,例如添加footer、添加ScrollListener监听( listview.setOnScrollListener(this);)。
*/
public class LoadMoreActivity extends AppCompatActivity implements AbsListView.OnScrollListener{
private LoadMoreActivityListener mLoadMoreActivityListener;
//这个方法靠子类调用,完成自身的初始化(这个“自身”指的是实现LoadMoreActivityListener接口的activity)。
public void initLoadMore(LoadMoreActivityListener loadMoreActivityListener){
this.mLoadMoreActivityListener=loadMoreActivityListener;
}
public static final int LOAD_LOGIC = 1;//上拉逻辑
private int result1;//上拉加载更多相关
private int result2;//上拉加载更多相关
//上拉加载更多操作
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LOAD_LOGIC:
mLoadMoreActivityListener.loadMore();//核心代码:这里通知子类可以加载更多了。
break;
}
}
};
//监听状态改变
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//滑动结束
if (result1 >= result2) {
//只发送一次,防止多次加载数据
if (!mHandler.hasMessages(LOAD_LOGIC))
mHandler.sendEmptyMessage(LOAD_LOGIC);
}
break;
case SCROLL_STATE_FLING:
break;
case SCROLL_STATE_TOUCH_SCROLL:
//滑动中
break;
}
}
//滑动结束之后执行
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
result1 = firstVisibleItem + visibleItemCount;
result2 = totalItemCount;
}
//接口,这个接口要靠继承上述LoadMoreActivity去实现,在loadMore()中实现加载更多操作
public interface LoadMoreActivityListener{
//这里写加载更多的逻辑,这个方法要靠实现类去实现,去完成加载更多操作。
public void loadMore();
}
}
使用
extends LoadMoreActivity implements LoadMoreActivity.LoadMoreActivityListener
onCreate(Bundle savedInstanceState)
中写super.onCreate(savedInstanceState);
loadMore()
中写加载更多操作即可。 import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.widget.AbsListView;
/**
* Created by wgyscsf on 2016/6/1.
* 邮箱:wgyscsf@163.com
* 博客:http://blog.csdn.net/wgyscsf
*/
/**
* 作用:该工具类简化了滑到底部的逻辑判断以及何时触发上拉加在更多;可以直接写上拉加载更多操作。(简单来说,你不用再去写何时到listview的底部这一块的操作以及发送加载更多的handler请求)
* 使用方式(三步):
* 1、让你的Fragment继承这个LoadMoreFragment(不再继承原有Fragment)
* 2、在你的onCreateView方法中写 super.initLoadMore(this);
* 3、让你的Fragment实现 LoadMoreFragment.LoadMoreFragmentListener 接口,在实现的方法中即可以写上拉加载更多的操作(自己维护页码变化)。
* 注意:原有操作不便,例如添加footer、添加ScrollListener监听( listview.setOnScrollListener(this);)。
*/
public class LoadMoreFragment extends Fragment implements AbsListView.OnScrollListener{
private LoadMoreFragmentListener mLoadMoreFragmentListener;
public void initLoadMore(LoadMoreFragmentListener loadMoreFragmentListener){
this.mLoadMoreFragmentListener=loadMoreFragmentListener;
}
public static final int LOAD_LOGIC = 1;//上拉逻辑
private int result1;//上拉加载更多相关
private int result2;//上拉加载更多相关
//这里进行刷新、上拉加载更多逻辑、上拉加载更多操作
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LOAD_LOGIC:
mLoadMoreFragmentListener.loadMore();
break;
}
}
};
//监听状态改变
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//滑动结束
if (result1 >= result2) {
//只发送一次,防止多次加载数据
if (!mHandler.hasMessages(LOAD_LOGIC))
mHandler.sendEmptyMessage(LOAD_LOGIC);
}
break;
case SCROLL_STATE_FLING:
break;
case SCROLL_STATE_TOUCH_SCROLL:
//滑动中
break;
}
}
//滑动结束之后执行
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
result1 = firstVisibleItem + visibleItemCount;
result2 = totalItemCount;
}
public interface LoadMoreFragmentListener{
//这里写加载更多的逻辑
public void loadMore();
}
}