这估计是我看的最痛苦的一部分了,唉,临近放假,实在是没心情没心情啊,计划不能推迟,搞起搞起~
对于加载更多功能的实现,其实与下拉刷新的功能实现思路相同,同样是刷新服务器数据(一般,服务器都会有一个More连接,用于储存加载更多URL),将新的数据添加到列表后面,不同的是检测加载更多的触发条件与列表展示方式不同。
效果图展示:
1 布局文件:
首先加载更多的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="5dp"
>
<ProgressBar
android:id="@+id/pb_refresh_foot_ProgressBar"
android:layout_marginLeft="10dp"
style="?android:attr/progressBarStyleLarge"
android:indeterminateDrawable="@drawable/custom_progress"
android:layout_width="0dp"
android:layout_height="57dp"
android:layout_weight="1"
/>
<TextView
android:id="@+id/tv_refresh_foot_Content"
android:gravity="center"
android:layout_width="0dp"
android:layout_weight="5"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="正在刷新..."
android:textSize="22sp"
android:textColor="@android:color/holo_red_light"
/>
</LinearLayout>
2 实现View脚布局实例:
public RefreshListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
InitHeaderView();
InitFooterView();
}
public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
InitHeaderView();
InitFooterView();
}
public RefreshListView(Context context) {
super(context);
InitHeaderView();
InitFooterView();
}
/*
* 添加脚布局
*/
private void InitFooterView()
{
mfootView = View.inflate(getContext(), R.layout.refresh_foot, null);
this.addFooterView(mfootView);
mfootView.measure(0,0);
mfootViewViewHeight=mfootView.getMeasuredHeight();
mfootView.setPadding(0, -mfootViewViewHeight, 0, 0);
this.setOnScrollListener(this);
}
3 提供外部调用接口:
OnRefreshListener mListener;
public void setOnRefreshListener(OnRefreshListener listener)
{
mListener=listener;
}
public interface OnRefreshListener{
public void onRefresh();
public void onLoadMore();//加载更多数据
}
4 监听事件:
对于加载更多时间的监听,采用的是在自定义ListView实现OnScrollListener,并实现内部两个方法。
private boolean isLoadingMore;//判断是否是加载了一次,放置多次刷新
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==SCROLL_STATE_IDLE//滑动休眠
||scrollState==SCROLL_STATE_FLING)//滑动结束
{
if(getLastVisiblePosition()==getCount()-1&&!isLoadingMore)//表示滑动到最后
{
System.out.println("到底了...");
mfootView.setPadding(0, 0, 0, 0);//到底了显示脚布局
setSelection(getCount());//表示最后一个被选中
isLoadingMore=true;
if(mListener!=null)
{
mListener.onLoadMore();
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
注意这里调用了onLoadMore(),在外部调用的时候(设置加载更多监听的位置),重新此方法,进行加载更多实现。
5 添加刷新监听对象,复写OnloadMore()方法:
在主调用函数中,进行onLoadMore()方法的复写:
lv_tablist.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
TabDetailPagerGetDataFromService();
}
@Override
public void onLoadMore() {
if(mMoreUrl!=null)
{
TabDetailPagerGet_More_DataFromService();
}
else
{
Toast.makeText(mActivity, "最后一页了!!!", Toast.LENGTH_SHORT).show();
lv_tablist.onRefreshComplete(false);//收起脚布局
}
}
});
6 数据获取
对于数据的获取,现对于下拉刷新功能,只需要更改一下URL即可:/*
* 获取加载更多网络数据
*/
private void TabDetailPagerGet_More_DataFromService() {
HttpUtils utils = new HttpUtils();
utils.send(HttpMethod.GET, mMoreUrl,new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result =(String) responseInfo.result;
TabDetailparseData(result,true);
lv_tablist.onRefreshComplete(true);//下拉刷新结束
}
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show();
error.printStackTrace();
System.out.println("TabDetailPager : 解析错误!!!");
lv_tablist.onRefreshComplete(false);
//下拉刷新结束
}
});
}
7 数据解析
对于数据的解析,需要判断是否是加载更多页,如果是加载更多页,需要将当前最新的数据添加在当前列表后:
/*
* 解析网络数据
*/
protected void TabDetailparseData(String result,boolean isMore) {
System.out.println("TabDetailparseData : "+result);
Gson gson = new Gson();
mTabDatilData =gson.fromJson(result, TabData.class);// 得到数据
System.out.println("页签详情页 "+ mTabDatilData);
String more =mTabDatilData.data.more;
if(!TextUtils.isEmpty(more)) //判断是否有下一页
{
mMoreUrl=GlobalContants.SERVICE_URL+more;
}
else
{
mMoreUrl=null;
}
if(!isMore)//没有下一页
{
if(mTabDatilData!=null)
{
mViewPager.setAdapter(new TopNewsAdapter()); // 设置ViewPager适配器
/*************** viewpagerIndicator *********************/
mIndicator.setViewPager(mViewPager);//设置头条新闻位置指示器
mIndicator.setSnap(true); // 快照显示
mIndicator.setCurrentItem(0);//将头条新闻位置指示器指向第一个,默认记录上次滑动的下标值
/**************** viewpagerIndicator ********************/
}
/******************* listView 新闻列表 *************************/
mNewsList=mTabDatilData.data.news;
mNewsdapger=new NewsAdapter();
// if(mNewsList!=null)
lv_tablist.setAdapter(mNewsdapger);
/******************** listView 新闻列表 ************************/
}
else{//如果是下一页,需要将数据追加到原来的集合
ArrayList<TabNewsData> news = mTabDatilData.data.news;//此时是新的新闻数据
mNewsList.addAll(news);
mNewsdapger.notifyDataSetChanged();//更新一下新闻数据
}
}
8 加载完毕后收起列表
最后加载完毕之后需要收起列表:/*
* 收起下拉刷新控件
*/
public void onRefreshComplete(boolean success){
if(isLoadingMore)//正在加载更多
{
mfootView.setPadding(0, -mfootViewViewHeight, 0, 0);
isLoadingMore=false;
}
else
{
mCurrentState=STATE_PULL_REFRESH;
reflash_content.setText("下拉刷新");
reflash_ProgressBar.setVisibility(View.INVISIBLE);
reflash_arr.setVisibility(View.VISIBLE);
mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);
if(success)
reflash_data.setText(GetCurrentTime());
}
}
思路整理一下就清晰了,但是时间跨度好大,放假求搞起搞起啊~~~~~~~~~