Android PullToRefresh库的两个改动例子

例一:我们先继承PullToRefreshListView

之后我们就可以在布局文件中直接使用lazylistview,用这种思路,可以让安卓的每一个页面都很方便地实现pull的动画和效果。

package com.base;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.shennongshi.dingdong.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;

public class LazyListView extends PullToRefreshListView {
	private Context mContext;
	private boolean hasMore = false;
	/**
	 * 是否正在加载数据
	 */
	private boolean isLoading = false;
	private View mLoadingFooterView;
	private OnPullListener onPullListener;

	public LazyListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public LazyListView(
			Context context,
			com.handmark.pulltorefresh.library.PullToRefreshBase.Mode mode,
			com.handmark.pulltorefresh.library.PullToRefreshBase.AnimationStyle style) {
		super(context, mode, style);
		init(context);
	}

	public LazyListView(Context context,
			com.handmark.pulltorefresh.library.PullToRefreshBase.Mode mode) {
		super(context, mode);
		init(context);
	}

	public LazyListView(Context context) {
		super(context);
		init(context);
	}

	private void init(Context context) {
		this.mContext = context;
		setMode(Mode.PULL_FROM_START);
		setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

			@Override
			public void onLastItemVisible() {
				if (hasMore && (onPullListener != null) && (!isLoading())) {
					isLoading = true;
					onPullListener.loadMore();
				}
			}
		});
	}

	/**
	 * 是否还有更多数据需要加载,每次加载数据后都需要调用此方法
	 * 
	 * @param hasMore
	 */
	public void notifyHasMore(boolean hasMore) {
		isLoading = false;
		onRefreshComplete();
		if (this.hasMore == hasMore) {
			return;
		}
		this.hasMore = hasMore;
		setupLoadingFooterView(hasMore);
	}

	private void setupLoadingFooterView(boolean hasMore) {
		if (hasMore) {
			inflateLoadingFooterView();
			// 以防万一
			if (getRefreshableView().getFooterViewsCount() > 0) {
				removeLoadingFooterView();
			}
			getRefreshableView().addFooterView(mLoadingFooterView, null, false);
		} else {
			removeLoadingFooterView();
		}
	}

	private void inflateLoadingFooterView() {
		if (mLoadingFooterView == null) {
			mLoadingFooterView = LayoutInflater.from(mContext).inflate(
					R.layout.footer_lazylistview, null);
			mLoadingFooterView.setClickable(false);
			getRefreshableView().setFooterDividersEnabled(false);
		}
	}

	private void removeLoadingFooterView() {
		if (mLoadingFooterView != null) {
			getRefreshableView().removeFooterView(mLoadingFooterView);
		}
	}

	// 处理4.0下版本的addHeaderView
	public View removeLoadingView() {
		if (mLoadingFooterView != null) {
			if (getRefreshableView().removeFooterView(mLoadingFooterView)) {
				return mLoadingFooterView;
			}
		}
		return null;
	}

	/**
	 * 设置监听
	 * 
	 * @param listener
	 */
	public void setOnPullListener(OnPullListener listener) {
		this.onPullListener = listener;
		setOnRefreshListener(new OnRefreshListener2<ListView>() {

			@Override
			public void onPullDownToRefresh(
					PullToRefreshBase<ListView> refreshView) {
				onPullListener.onRefresh(refreshView);
			}

			@Override
			public void onPullUpToRefresh(
					PullToRefreshBase<ListView> refreshView) {
				onPullListener.loadMore();
			}
		});
	}

	public boolean isLoading() {
		return isLoading;
	}

	public void setLoading(boolean isLoading) {
		this.isLoading = isLoading;
	}

	public static interface OnPullListener {

		void loadMore();

		void onRefresh(PullToRefreshBase<ListView> refreshView);
	}
}
例二:

我们项目中要实现有刷新动画的列表,同时都要让tab有悬浮效果,可以在列表上滑后仍停留在顶部。下面是个人的粗浅实现方式。

希望能帮到大家。

package com.shennongshi.dingdong.ui.xuewen.liebiao;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import com.base.ActBase;
import com.base.ActGuide;
import com.base.FragBase;
import com.base.FragPBDialog;
import com.base.GetDataManager;
import com.base.IVolleyResponse;
import com.base.LazyListView;
import com.base.LazyListView.OnPullListener;
import com.base.ViewTitle;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.shennongshi.dingdong.BuildConfig;
import com.shennongshi.dingdong.R;
import com.shennongshi.dingdong.entity.EmyAnswer;
import com.shennongshi.dingdong.entity.EmyAnswerList;
import com.shennongshi.dingdong.entity.EmyQuestion;
import com.shennongshi.dingdong.entity.EmyQuestionList;
import com.shennongshi.dingdong.entity.Emyxianshi;
import com.shennongshi.dingdong.entity.EmyxianshiList;
import com.shennongshi.dingdong.entity.EtoAnswer;
import com.shennongshi.dingdong.entity.EtoAnswerList;
import com.shennongshi.dingdong.pztools.PreferenceKey;
import com.shennongshi.dingdong.pztools.Urls.POST;
import com.third.volley.VolleyError;
import com.umeng.analytics.MobclickAgent;
import com.utils.db.ConfigPreferences;
import com.utils.tools.UmengCount;
import com.utils.tools.XToaster;

import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Fragxuewenlistpulltorefresh extends FragBase implements OnPullListener {
	
	public ListView lvxm;
	protected LazyListView lazyView;
	
	
	private FragHeaderHYZX headerview;
	private LinearLayout viewxf;
	private LinearLayout xuanfu;
	
	private AdapterXianShi adapter0;
	private AdapterWYHD adapter1;
	private AdapterWDTW adapter2;
	private AdapterWDHD adapter3;
	private EmyxianshiList mdata0;
	private EtoAnswerList mdata1;
	private EmyQuestionList mdata2;
	private EmyAnswerList mdata3;
	
	
	private FragPBDialog mPbDialog;
	
	private String sid;
	private RelativeLayout mEmptyView;
	public String page = "0";
	public int index = 0;
	
	//播放动画视图
	public View item_recorder_anim ;
	
	//请求不重复标志
	boolean isrequest0 = false;
	boolean isrequest1 = false;
	boolean isrequest2 = false;
	boolean isrequest3 = false;
	private RadioGroup temp1;
	private RadioGroup temp2;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		 if (!BuildConfig.DEBUG) MobclickAgent.onEvent(getActivity(), UmengCount.OPEN_LIMITED_TIME_FREE);
		sid = ConfigPreferences.getString(PreferenceKey.Sid, "");
	}
	
	
	@Override
	public void onPause() {
		super.onPause();
		MediaManager.pause();
	}

	@Override
	public void onResume() {
		MediaManager.resume();
		super.onResume();
	}



	@Override
	protected View initContainerView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.frag_xuewen_newpulltorefresh, container, false);
		lazyView = (LazyListView) v.findViewById(R.id.frag_xuewen_list);
		lazyView.setMode(setListMode());
		lazyView.setOnPullListener(this);
		lvxm = lazyView.getRefreshableView();
		lvxm.setVerticalScrollBarEnabled(false);
		lvxm.setSelector(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
		lvxm.setFadingEdgeLength(0);
		lvxm.setDivider(null);
		lvxm.setOnScrollListener(onScrollListener);
		viewxf = (LinearLayout) v.findViewById(R.id.frag_jrdd_xuanfu);
		temp1 = (RadioGroup) viewxf.findViewById(R.id.footer_huatiliebiao_content);
		temp1.setOnCheckedChangeListener(xuewenlistener);
		adapter0 = new AdapterXianShi(getActivity());
		adapter1 = new AdapterWYHD(getActivity());
		adapter2 = new AdapterWDTW(getActivity());
		adapter3 = new AdapterWDHD(getActivity());
		setListTitle(lvxm);
		if(index == 0)
			requestdata0();
		else if(index == 1)
			requestdata1();
			else if(index == 2)
				requestdata2();
			else if(index == 3)
				requestdata3();
		return v;
	}
	
	
	protected Mode setListMode() {
		return Mode.PULL_FROM_START;
	}
	


	private void setListTitle(ListView lvxm2) {
		if (headerview == null) headerview = new FragHeaderHYZX(getContext());
		lvxm2.addHeaderView(headerview);
		xuanfu = (LinearLayout) View.inflate(getContext(), R.layout.frag_xuewen_title_xm,
				null);
		temp2 = (RadioGroup) xuanfu.findViewById(R.id.footer_huatiliebiao_content);
		temp2.setOnCheckedChangeListener(xuewenlistener);
		lvxm2.addHeaderView(xuanfu);
	}
	
	
	private void requestdata0() {
		if(isrequest0 == true) {
			isrequest0 = false;
			return;
		}
		isrequest0 = true;
		showDialog();
		JSONObject jsonP = new JSONObject();
		try {
			jsonP.put("sid", sid);
			jsonP.put("page", page);
		} catch (JSONException e) {
			e.printStackTrace();
		}
	GetDataManager.post(POST.LIMITEDFREELIST, jsonP, EmyxianshiList.class, new IVolleyResponse<EmyxianshiList>() {

			@Override
			public void onResponse(EmyxianshiList response) {
				        isrequest0 = false;
						if (getActivity() == null)
							return;
						if (response == null)
							return;
						dismissDialog();
						if(mdata0 == null) mdata0 = new EmyxianshiList();
						if(page.equals("0"))
						mdata0 = response;
						else{
							List<Emyxianshi> news_list = response.getXianshi_list();
							if(news_list.size() > 0){
							for(int i = 0 ; i < news_list.size() ; i ++ ){
							mdata0.getXianshi_list().add(news_list.get(i));
							}
							}
							else XToaster.show("没有更多数据了");
						}
						adapter0.updateData(mdata0.getXianshi_list());
						lvxm.setAdapter(adapter0);
						onRefreshComplete();
					}

					@Override
					public void onErrorListener(VolleyError error) {
						isrequest0 = false;
						if (getActivity() == null)
							return;
						dismissDialog();
						super.onErrorListener(error);
					}
				});
	}
	
	

	public void requestdata1() {
		if(isrequest1 == true) {
			isrequest1 = false;
			return;
		}
		isrequest1 = true;
		showDialog();
		JSONObject jsonP = new JSONObject();
		try {
			jsonP.put("sid", sid);
			jsonP.put("page", page);
		} catch (JSONException e) {
			e.printStackTrace();
		}
		GetDataManager.post(POST.TOANSWERLIST, jsonP, EtoAnswerList.class, new IVolleyResponse<EtoAnswerList>() {

			@Override
			public void onResponse(EtoAnswerList response) {
				isrequest1 = false;
						if (getActivity() == null)
							return;
						if (response == null)
							return;
						dismissDialog();
						if(mdata1 == null) mdata1 = new EtoAnswerList();
						if(page.equals("0"))
						mdata1 = response;
						else{
							List<EtoAnswer> news_list = response.getQuestion_list();
							if(news_list.size() > 0){
							for(int i = 0 ; i < news_list.size() ; i ++ ){
							mdata1.getQuestion_list().add(news_list.get(i));
							}
							}
							else XToaster.show("没有更多数据了");
						}
						adapter1.updateData(mdata1.getQuestion_list());
						lvxm.setAdapter(adapter1);
						onRefreshComplete();
					}

					@Override
					public void onErrorListener(VolleyError error) {
						isrequest1 = false;
						if (getActivity() == null)
							return;
						dismissDialog();
						super.onErrorListener(error);
					}
				});
	}
	
	private void requestdata2() {
		if(isrequest2 == true) {
			isrequest2 = false;
			return;
		}
		isrequest2 = true;
		showDialog();
		JSONObject jsonP = new JSONObject();
		try {
			jsonP.put("sid", sid);
			jsonP.put("page", page);
		} catch (JSONException e) {
			e.printStackTrace();
		}
	GetDataManager.post(POST.MYQUESTIONLIST, jsonP, EmyQuestionList.class, new IVolleyResponse<EmyQuestionList>() {

			

			@Override
			public void onResponse(EmyQuestionList response) {
				isrequest2 = false;
						if (getActivity() == null)
							return;
						if (response == null)
							return;
						dismissDialog();
						if(mdata2 == null) mdata2 = new EmyQuestionList();
						if(page.equals("0"))
						mdata2 = response;
						else{
							List<EmyQuestion> news_list = response.getQuestion_list();
							if(news_list.size() > 0){
							for(int i = 0 ; i < news_list.size() ; i ++ ){
							mdata2.getQuestion_list().add(news_list.get(i));
							}
							}
							else XToaster.show("没有更多数据了");
						}
						adapter2.updateData(mdata2.getQuestion_list());
						lvxm.setAdapter(adapter2);
						onRefreshComplete();
					}

					@Override
					public void onErrorListener(VolleyError error) {
						isrequest2 = false;
						if (getActivity() == null)
							return;
						dismissDialog();
						super.onErrorListener(error);
					}
				});
	}
	
	private void requestdata3() {
		if(isrequest3 == true) {
			isrequest3 = false;
			return;
		}
		isrequest3 = true;
		showDialog();
		JSONObject jsonP = new JSONObject();
		try {
			jsonP.put("sid", sid);
			jsonP.put("page", page);
		} catch (JSONException e) {
			e.printStackTrace();
		}
GetDataManager.post(POST.MYANSWERLIST, jsonP, EmyAnswerList.class, new IVolleyResponse<EmyAnswerList>() {

			@Override
			public void onResponse(EmyAnswerList response) {
				isrequest3 = false;
						if (getActivity() == null)
							return;
						if (response == null)
							return;
						dismissDialog();
						if(mdata3 == null) mdata3 = new EmyAnswerList();
						if(page.equals("0"))
						mdata3 = response;
						else{
							List<EmyAnswer> news_list = response.getAnswer_list();
							if(news_list.size() > 0){
							for(int i = 0 ; i < news_list.size() ; i ++ ){
							mdata3.getAnswer_list().add(news_list.get(i));
							}
							}
							else XToaster.show("没有更多数据了");
						}
						adapter3.updateData(mdata3.getAnswer_list());
						lvxm.setAdapter(adapter3);
						onRefreshComplete();
					}

					@Override
					public void onErrorListener(VolleyError error) {
						isrequest3 = false;
						if (getActivity() == null)
							return;
						dismissDialog();
						super.onErrorListener(error);
					}
				});
	}

	@Override
	protected void setTitleView(ViewTitle titleView) {
		titleView.setZhongJianText("学问");
		TextView youbian = new TextView(getActivity());
		youbian.setPadding(8, 2, 8, 2);
		youbian.setBackground(getResources().getDrawable(R.drawable.shape_round_mainyellow));
		youbian.setText("提问");
		youbian.setTextColor(getResources().getColor(R.color.white));
		titleView.addYouBianView(youbian);
		youbian.setOnClickListener(imagelistener);
		Drawable draw1 = getResources().getDrawable(R.drawable.white);
		titleView.setZuobianImg(draw1);
	}
	
	private OnClickListener imagelistener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			ActGuide.go(getContext(), ActGuide.FRAG_XWFB);
		}
	};

	private OnScrollListener onScrollListener = new OnScrollListener() {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			FragmentActivity activity = getActivity();
			if (activity == null) return;
			if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING ||
					scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
				((ActBase) activity).getImageFetcher().setPauseWork(true);
			} else {
				((ActBase) activity).getImageFetcher().setPauseWork(false);
			}			
			lazyView.onScrollStateChanged(lvxm, scrollState);
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			if (viewxf == null)
				return;
			if (firstVisibleItem >= 2) {
				viewxf.setVisibility(View.VISIBLE);
			} else {

				viewxf.setVisibility(View.GONE);
			}
		}
	};
	
	private OnCheckedChangeListener xuewenlistener = new OnCheckedChangeListener() {

		@Override
		public void onCheckedChanged(RadioGroup group, int checkedId) {
			switch (checkedId) {
			
			case R.id.tab_xw_d:
				index = 0;
				page = "0";
				 if (!BuildConfig.DEBUG) MobclickAgent.onEvent(getActivity(), UmengCount.OPEN_LIMITED_TIME_FREE);
				((RadioButton)temp2.getChildAt(0)).setChecked(true);
				((RadioButton)temp1.getChildAt(0)).setChecked(true);
				requestdata0();
//				lvxm.setAdapter(adapter0);
				break;
			
			case R.id.tab_xw_a:
				index = 1;
				page = "0";
				 if (!BuildConfig.DEBUG) MobclickAgent.onEvent(getActivity(), UmengCount.OPEN_OTHER_QUESION);
				((RadioButton)temp2.getChildAt(1)).setChecked(true);
				((RadioButton)temp1.getChildAt(1)).setChecked(true);
				requestdata1();
//				lvxm.setAdapter(adapter1);
				break;

			case R.id.tab_xw_b:
				index = 2;
				page = "0";
				if (!BuildConfig.DEBUG) MobclickAgent.onEvent(getActivity(), UmengCount.OPEN_TIWEN);
				((RadioButton)temp2.getChildAt(2)).setChecked(true);
				((RadioButton)temp1.getChildAt(2)).setChecked(true);
				requestdata2();
//				lvxm.setAdapter(adapter2);
				break;

			case R.id.tab_xw_c:
				index = 3;
				page = "0";
				 if (!BuildConfig.DEBUG) MobclickAgent.onEvent(getActivity(), UmengCount.OPEN_MY_ANSWER);
				((RadioButton)temp2.getChildAt(3)).setChecked(true);
				((RadioButton)temp1.getChildAt(3)).setChecked(true);
				requestdata3();
//				lvxm.setAdapter(adapter3);
				break;

			default:
				break;
			}
			if(MediaManager.mPlayer == null) {  
				MediaManager.mPlayer = new MediaPlayer();  
	        }
				
				 boolean isPlaying = false;  
			        try {  
			            isPlaying = MediaManager.mPlayer.isPlaying();  
			        }  
			        catch (IllegalStateException e) {  
			        	MediaManager.mPlayer = null;  
			        	MediaManager.mPlayer = new MediaPlayer(); 
			        }  
				if(isPlaying){  
					MediaManager.mPlayer.stop();  
					MediaManager.mPlayer.release();  
		        }
				if (item_recorder_anim!=null) {//让第二个播放的时候第一个停止播放
					item_recorder_anim.setBackground(getResources().getDrawable(R.drawable.v_anim3));
					item_recorder_anim=null;
				}
		}
	};


	@Override
	public void loadMore() {
		page =String.valueOf(Integer.valueOf(page) + 1);
		if(index == 0)
			requestdata0();
		else if(index == 1)
			requestdata1();
			else if(index == 2)
				requestdata2();
			else if(index == 3)
				requestdata3();
	}

	@Override
	public void onRefresh(PullToRefreshBase<ListView> refreshView) {
		page = "0";
		if(index == 0)
			requestdata0();
		else if(index == 1)
			requestdata1();
			else if(index == 2)
				requestdata2();
			else if(index == 3)
				requestdata3();
	}
	
	protected void onRefreshComplete() {
        if (lazyView != null) lazyView.onRefreshComplete();
    }

    protected void setNotifyHasMore(boolean hasMore) {
    	if (lazyView != null) lazyView.notifyHasMore(hasMore);
    }

    protected void setRefreshing() {
    	if (lazyView != null) lazyView.setRefreshing();
    }

}


相应的xml文件:无一例外的,我分享出来的页面实现全部都是fragment类型,大家拿回去就能直接使用。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ptr="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.base.LazyListView
        android:id="@+id/frag_xuewen_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ptr:ptrMode="pullFromStart" />

    <LinearLayout
        android:id="@+id/frag_jrdd_xuanfu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:visibility="visible" >

        <RadioGroup
            android:id="@+id/footer_huatiliebiao_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:orientation="horizontal" >
            
            <RadioButton
                android:id="@+id/tab_xw_d"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/selector_xuewen0"
                android:button="@null"
                android:gravity="center" />

            <RadioButton
                android:id="@+id/tab_xw_a"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/selector_xuewen1"
                android:button="@null"
                android:gravity="center" />

            <RadioButton
                android:id="@+id/tab_xw_b"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/selector_xuewen2"
                android:button="@null"
                android:gravity="center" />

            <RadioButton
                android:id="@+id/tab_xw_c"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/selector_xuewen3"
                android:button="@null"
                android:gravity="center" />
        </RadioGroup>

        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/fengexianxi" />
    </LinearLayout>

</FrameLayout>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值