例一:我们先继承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>