1.添加載入更多布局
1_初始化和隱藏代碼
在RefreshListView構造方法中調用
private void initFooterView(Context context) {View footerView = View.inflate(context, R.layout.refresh_listview_footer, null);//隱藏代碼footerView.measure(0, 0);int footerViewHeight = footerView.getMeasuredHeight();footerView.setPadding(0, -footerViewHeight, 0, 0);this.addFooterView(footerView);}
2_布局檔案refresh_listview_footer.xml
<?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="wrap_content"android:gravity="center"android:orientation="horizontal" ><ProgressBarandroid:layout_margin="5dip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:indeterminateDrawable="@drawable/custom_progressbar" /><TextViewandroid:layout_marginLeft="10dip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="載入更多中..."android:textColor="#ff0000"android:textSize="25sp" /></LinearLayout>
2.拖動到底部的時候
/*** 菜單頁面對應的新聞頁簽頁面* 總共有12個* @author Administrator**/public class TabMenuDetailPager extends MenuDetailBasePagerimplements OnPageChangeListener {/*** 新聞中心-新聞菜單對應的標籤對應的資料*/private NewCenterTag newCenterTag;......................./*** 載入更多資料的URL*/private String moreUrl;/*** 是否載入更多資料中*/protected boolean isLoadingMore = false;...................@Overridepublic View initView() {View view = View.inflate(mActivity, R.layout.tab_detail, null);//把View注入到XUtils架構中ViewUtils.inject(this, view); .......................... //設定監聽下拉重新整理mListView.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onPullDownRefresh() {isPullDownRefreshing = true;getDataFromNet();}@Overridepublic void onLoadingMore() {if(TextUtils.isEmpty(moreUrl)){Toast.makeText(mActivity, "沒有更多資料了", 1).show();mListView.onRefreshFinish(false);}else{//有更多資料,要載入更多資料了getMoreDataFromNet();}}});return view;}/*** 載入更多資料*/protected void getMoreDataFromNet() {HttpUtils httpUtils = new HttpUtils();httpUtils.send(HttpMethod.GET, moreUrl, new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {System.out.println("載入更多資料成功:"+responseInfo.result);mListView.onRefreshFinish(false);isLoadingMore = true;processData(responseInfo.result);}@Overridepublic void onFailure(HttpException error, String msg) {mListView.onRefreshFinish(false);System.out.println("載入更多資料失敗:"+ msg);}}); }/*** 處理和解析json資料* @param json*/protected void processData(String json) {TabDetailBean bean = parserJson(json);if(!isLoadingMore){System.out.println(bean.data.news.get(0).title);topnews = bean.data.topnews;//給ViewPager設定適配器TabDetailAdapter adapter = new TabDetailAdapter();mViewPager.setAdapter(adapter);// 把所有的View清除ll_point_group.removeAllViews();for(int i=0;i<topnews.size();i++){View point = new View(mActivity);LayoutParams params = new LayoutParams(5, 5) ;point.setBackgroundResource(R.drawable.tab_detail_point_bg);if(i!=0){params.leftMargin = 10;}point.setEnabled(false);point.setLayoutParams(params);ll_point_group.addView(point);}previousPointPosition = 0;//設定預設的圖片描述和指示點mtv_title_description.setText(topnews.get(previousPointPosition).title);ll_point_group.getChildAt(previousPointPosition).setEnabled(true);//設定頁面改變的監聽mViewPager.setOnPageChangeListener(this);//設定適配器和對應的資料newsLists = bean.data.news;listViewAdapter = new ListViewAdapter();mListView.setAdapter(listViewAdapter);// mListView.addHeaderView(v) ;//把一個視圖一頭的方式添加到ListView中 }else{//把列表新聞取出來,在載入到以前的集合中,在重新整理資料isLoadingMore = false;List<News>moreDataNews = bean.data.news;newsLists.addAll(moreDataNews);listViewAdapter.notifyDataSetChanged();//重新整理資料}}................/*** 用Gson開源項目解析json* @param json*/private TabDetailBean parserJson(String json) {Gson gson = new Gson();TabDetailBean bean = gson.fromJson(json, TabDetailBean.class);moreUrl = bean.data.more;if(TextUtils.isEmpty(moreUrl)){moreUrl = null;}else{moreUrl = ConstantUtils.server_url+moreUrl;}return bean;}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}...............}
3.完整代碼
package com.atguigu.refreshlistview;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import java.text.SimpleDateFormat;import java.util.Date;/*** 作用:自訂下拉重新整理的ListView*/public class RefreshListview extends ListView {/*** 下拉重新整理和頂部輪播圖*/private LinearLayout headerView;/*** 下拉重新整理控制項*/private View ll_pull_down_refresh;private ImageView iv_arrow;private ProgressBar pb_status;private TextView tv_status;private TextView tv_time;/*** 下拉重新整理控制項的高*/private int pullDownRefreshHeight;/*** 下拉重新整理*/public static final int PULL_DOWN_REFRESH = 0;/*** 手鬆重新整理*/public static final int RELEASE_REFRESH = 1;/*** 正在重新整理*/public static final int REFRESHING = 2;/*** 目前狀態*/private int currentStatus = PULL_DOWN_REFRESH;private Animation upAnimation;private Animation downAnimation;/*** 載入更多的控制項*/private View footerView;/*** 載入更多控制項高*/private int footerViewHeight;/*** 是否已經載入更多*/private boolean isLoadMore = false;/*** 頂部輪播圖部分*/private View topNewsView;/*** ListView在Y軸上的座標*/private int listViewOnScreenY = -1;public RefreshListview(Context context) {this(context, null);}public RefreshListview(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RefreshListview(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initHeaderView(context);initAnimation();initFooterView(context);}private void initFooterView(Context context) {footerView = View.inflate(context, R.layout.refresh_footer, null);footerView.measure(0, 0);footerViewHeight = footerView.getMeasuredHeight();footerView.setPadding(0, -footerViewHeight, 0, 0);//ListView添加footeraddFooterView(footerView);//監聽ListView的滾動setOnScrollListener(new MyOnScrollListener());}/*** 添加頂部輪播圖* @param topNewsView*/public void addTopNewsView(View topNewsView) {if(topNewsView != null){this.topNewsView =topNewsView;headerView.addView(topNewsView);}}class MyOnScrollListener implements OnScrollListener{@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {//當靜止或者慣性滾動的時候if(scrollState ==OnScrollListener.SCROLL_STATE_IDLE||scrollState ==OnScrollListener.SCROLL_STATE_FLING){//並且是最後一條可見if(getLastVisiblePosition()>=getCount()-1){//1.顯示載入更多布局footerView.setPadding(8,8,8,8);//2.狀態改變isLoadMore = true;//3.回調介面if(mOnRefreshListener != null){mOnRefreshListener.onLoadMore();}}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}}private void initAnimation() {upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);upAnimation.setDuration(500);upAnimation.setFillAfter(true);downAnimation = new RotateAnimation(-180, -360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);downAnimation.setDuration(500);downAnimation.setFillAfter(true);}private void initHeaderView(Context context) {headerView = (LinearLayout) View.inflate(context, R.layout.refresh_header, null);//下拉重新整理控制項ll_pull_down_refresh = headerView.findViewById(R.id.ll_pull_down_refresh);iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow);pb_status = (ProgressBar) headerView.findViewById(R.id.pb_status);tv_status = (TextView) headerView.findViewById(R.id.tv_status);tv_time = (TextView) headerView.findViewById(R.id.tv_time);//測量ll_pull_down_refresh.measure(0, 0);pullDownRefreshHeight = ll_pull_down_refresh.getMeasuredHeight();//預設隱藏下拉重新整理控制項// View.setPadding(0,-控制項高,0,0);//完全隱藏//View.setPadding(0, 0,0,0);//完全顯示ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);//添加ListView的頭addHeaderView(headerView);}private float startY = -1;@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN://1.記錄起始座標startY = ev.getY();break;case MotionEvent.ACTION_MOVE:if (startY == -1) {startY = ev.getY();}//判斷頂部輪播圖是否完全顯示,只有完全顯示才會有下拉重新整理boolean isDisplayTopNews = isDisplayTopNews();if(!isDisplayTopNews){//載入更多break;}//如果是正在重新整理,就不讓再重新整理了if (currentStatus == REFRESHING) {break;}//2.來到新的座標float endY = ev.getY();//3.記錄滑動的距離float distanceY = endY - startY;if (distanceY > 0) {//下拉//int paddingTop = -控制項高 + distanceY;int paddingTop = (int) (-pullDownRefreshHeight + distanceY);if (paddingTop < 0 && currentStatus != PULL_DOWN_REFRESH) {//下拉重新整理狀態currentStatus = PULL_DOWN_REFRESH;//更新狀態refreshViewState();} else if (paddingTop > 0 && currentStatus != RELEASE_REFRESH) {//手鬆重新整理狀態currentStatus = RELEASE_REFRESH;//更新狀態refreshViewState();}ll_pull_down_refresh.setPadding(0, paddingTop, 0, 0);//View.setPadding(0,paddingTop,0,0);//動態顯示下拉重新整理控制項}break;case MotionEvent.ACTION_UP:startY = -1;if (currentStatus == PULL_DOWN_REFRESH) {// View.setPadding(0,-控制項高,0,0);//完全隱藏ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);} else if (currentStatus == RELEASE_REFRESH) {//設定狀態為正在重新整理currentStatus = REFRESHING;refreshViewState();// View.setPadding(0,0,0,0);//完全顯示ll_pull_down_refresh.setPadding(0, 0, 0, 0);//回調介面if (mOnRefreshListener != null) {mOnRefreshListener.onPullDownRefresh();}}break;}return super.onTouchEvent(ev);}/*** 判斷是否完全顯示頂部輪播圖* 當ListView在螢幕上的Y軸座標小於或者等於頂部輪播圖在Y軸的座標的時候,頂部輪播圖完全顯示* @return*/private boolean isDisplayTopNews() {if(topNewsView != null){//1.得到ListView在螢幕上的座標int[] location = new int[2];if(listViewOnScreenY == -1){getLocationOnScreen(location);listViewOnScreenY = location[1];}//2.得到頂部輪播圖在螢幕上的座標topNewsView.getLocationOnScreen(location);int topNewsViewOnScreenY = location[1];// if(listViewOnScreenY <= topNewsViewOnScreenY){// return true;// }else{// return false;// }return listViewOnScreenY <= topNewsViewOnScreenY;}else{return true;}}private void refreshViewState() {switch (currentStatus) {case PULL_DOWN_REFRESH://下拉重新整理狀態iv_arrow.startAnimation(downAnimation);tv_status.setText("下拉重新整理...");break;case RELEASE_REFRESH://手鬆重新整理狀態iv_arrow.startAnimation(upAnimation);tv_status.setText("手鬆重新整理...");break;case REFRESHING://正在重新整理狀態tv_status.setText("正在重新整理...");pb_status.setVisibility(VISIBLE);iv_arrow.clearAnimation();iv_arrow.setVisibility(GONE);break;}}/*** 當連網成功和失敗的時候回調該方法* 使用者重新整理狀態的還原** @param sucess*/public void onRefreshFinish(boolean sucess) {if(isLoadMore){//載入更多isLoadMore = false;//隱藏載入更多布局footerView.setPadding(0,-footerViewHeight,0,0);}else{//下拉重新整理tv_status.setText("下拉重新整理...");currentStatus = PULL_DOWN_REFRESH;iv_arrow.clearAnimation();pb_status.setVisibility(GONE);iv_arrow.setVisibility(VISIBLE);//隱藏下拉重新整理控制項ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);if (sucess) {//設定最新更新時間tv_time.setText("上次更新時間:" + getSystemTime());}}}/*** 得到當前Android系統的時間** @return*/private String getSystemTime() {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return format.format(new Date());}/*** 監聽控制項的重新整理*/public interface OnRefreshListener {/*** 當下拉重新整理的時候回調這個方法*/public void onPullDownRefresh();/**當載入更多的時候回調這個方法*/public void onLoadMore();}private OnRefreshListener mOnRefreshListener;/*** 設定監聽重新整理,由外界設定*/public void setOnRefreshListener(OnRefreshListener l) {this.mOnRefreshListener = l;}}
以上所述是小編給大家介紹的Android 仿矽谷新聞下拉重新整理/上拉載入更多,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!