加载更多功能实现

这估计是我看的最痛苦的一部分了,唉,临近放假,实在是没心情没心情啊,计划不能推迟,搞起搞起~

对于加载更多功能的实现,其实与下拉刷新的功能实现思路相同,同样是刷新服务器数据(一般,服务器都会有一个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());
			
		}
	}



思路整理一下就清晰了,但是时间跨度好大,放假求搞起搞起啊~~~~~~~~~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值