智慧北京开发第四天(上)
2016-02-11 00:45
309 查看
新闻列表上拉刷新数据
原理图:头布局文件:refresh_header.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:orientation="horizontal"> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/common_listview_headview_red_arrow" android:id="@+id/iv_arr"/> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="invisible" android:indeterminateDrawable="@drawable/custom_progress" android:id="@+id/pb_progress"/> </FrameLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="center" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下拉刷新" android:textColor="#f00" android:id="@+id/tv_title" android:textSize="16sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:id="@+id/tv_time" android:text="最后刷新时间:2015-02-10 10:05:20" android:textColor="@android:color/darker_gray" android:textSize="14sp"/> </LinearLayout> </LinearLayout>效果图:
自定义加载圆环形状进度条:
custom_progress.xml
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360"> <shape android:innerRadius="12dp" android:shape="ring" android:thickness="3dp" android:useLevel="false"> <gradient android:centerColor="#3f00" android:endColor="#f00" android:startColor="#fff"/> </shape> </rotate>RefreshListView.java
package com.xbmu.wisdombj.view; 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.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.xbmu.wisdombj.R; import java.text.SimpleDateFormat; import java.util.Date; /** * 上拉刷新数据的ListView * Created by Administrator on 2016/2/10 0010. */ public class RefreshListView extends ListView { private static final int STATE_PULL_REFRESH = 0;//下拉刷新 private static final int STATE_RELEASE_REFRESH = 1;//松开刷新 private static final int STATE_REFRESHING = 2;//正在刷新 private int mCurrentState = STATE_PULL_REFRESH;//当前状态 private int mHeaderViewHeight;//头布局的高度 private int startY = -1;//滑动起点的y坐标 private int endY; private View mHeaderView; private TextView tvTitle; private TextView tvTime; private ImageView ivArrow; private ProgressBar pbProgress; private String currentTime; private RotateAnimation animUp; private RotateAnimation animDown; public RefreshListView(Context context) { super(context); initHeaderView(); } public RefreshListView(Context context, AttributeSet attrs) { super(context, attrs); initHeaderView(); } public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initHeaderView(); } /** * 初始化头布局 */ private void initHeaderView() { mHeaderView = View.inflate(getContext(), R.layout.refresh_header, null); this.addHeaderView(mHeaderView); tvTitle = (TextView) mHeaderView.findViewById(R.id.tv_title); tvTime = (TextView) mHeaderView.findViewById(R.id.tv_time); ivArrow = (ImageView) mHeaderView.findViewById(R.id.iv_arr); pbProgress = (ProgressBar) mHeaderView.findViewById(R.id.pb_progress); mHeaderView.measure(0, 0);//测量视图大小 mHeaderViewHeight = mHeaderView.getMeasuredHeight();//获得视图的高度 mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);//隐藏头布局 initArrowAnim(); tvTime.setText("最后刷新时间:" + getCurrentTime()); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: startY = (int) ev.getRawY(); break; case MotionEvent.ACTION_MOVE: if(startY == -1){//确保startY有效 startY = (int) ev.getRawY(); } endY = (int) ev.getRawY(); int dy = endY - startY;//移动偏移量 if(dy > 0 && getFirstVisiblePosition() == 0){ //偏移量大于0 并且当前是第一个item,才允许下拉 int padding = dy - mHeaderViewHeight;//计算padding mHeaderView.setPadding(0,padding,0,0);//设置当前padding if(padding > 0 && mCurrentState != STATE_RELEASE_REFRESH){//状态改为松开刷新 mCurrentState = STATE_RELEASE_REFRESH; refreshState(); }else if(padding < 0 && mCurrentState != STATE_PULL_REFRESH){//改为下来刷新状态 mCurrentState = STATE_PULL_REFRESH; refreshState(); } return true; } break; case MotionEvent.ACTION_UP: startY = -1;//重置 if(mCurrentState == STATE_RELEASE_REFRESH){ mCurrentState = STATE_REFRESHING;//正在刷新 mHeaderView.setPadding(0,0,0,0);//显示 refreshState(); }else if(mCurrentState == STATE_PULL_REFRESH){ mHeaderView.setPadding(0,-mHeaderViewHeight,0,0);//隐藏 } break; default: break; } return super.onTouchEvent(ev); } /** * 定义一个刷新的接口 */ public interface OnRefreshListener{ /**刷新*/ public void onReFresh(); } OnRefreshListener mListener; /** * 设置刷新的监听事件 */ public void setOnRefreshListener(OnRefreshListener listener){ mListener = listener; } /** * 刷新下拉控件的布局 */ private void refreshState() { switch (mCurrentState){ case STATE_PULL_REFRESH: tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animDown); break; case STATE_RELEASE_REFRESH: tvTitle.setText("松开刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animUp); break; case STATE_REFRESHING: tvTitle.setText("正在刷新..."); ivArrow.clearAnimation();//必须先清除动画,才能隐藏 ivArrow.setVisibility(View.INVISIBLE); pbProgress.setVisibility(View.VISIBLE); //调用刷新接口 if(mListener!=null) { mListener.onReFresh(); } break; default: break; } } /** * 初始化箭头动画 */ private void initArrowAnim() { //箭头向上动画 animUp = new RotateAnimation(0,-180, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animUp.setDuration(200); animUp.setFillAfter(true); //箭头向下动画 animDown = new RotateAnimation(-180,0, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); animDown.setDuration(200); animDown.setFillAfter(true); } /** * 收起下拉刷新的控件 */ public void onRefreshComplete(){ mCurrentState = STATE_PULL_REFRESH; tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);//隐藏 tvTime.setText("最后刷新时间:"+getCurrentTime()); } /** * 获取当前时间 * @return */ public String getCurrentTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(new Date()); } }tab_detail_pager.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:orientation="vertical"> <com.xbmu.wisdombj.view.RefreshListView android:id="@+id/lv_tab_list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </com.xbmu.wisdombj.view.RefreshListView> </LinearLayout>TabDetailPager.java
package com.xbmu.wisdombj.base; import android.app.Activity; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import com.lidroid.xutils.http.client.HttpRequest.HttpMethod; import com.lidroid.xutils.view.annotation.ViewInject; import com.viewpagerindicator.CirclePageIndicator; import com.xbmu.wisdombj.R; import com.xbmu.wisdombj.bean.NewsData.NewsTabData; import com.xbmu.wisdombj.bean.TabData; import com.xbmu.wisdombj.bean.TabData.TabNewsData; import com.xbmu.wisdombj.bean.TabData.TopNewsData; import com.xbmu.wisdombj.global.GlobalVariables; import com.xbmu.wisdombj.view.RefreshListView; import java.util.ArrayList; /** * 页签详情页,表示每一个页签的对象 * Created by Administrator on 2016/2/7 0007. */ public class TabDetailPager extends BaseNewsDetailPager implements ViewPager.OnPageChangeListener { private NewsTabData mTabData;//新闻的 11个子标签标题 @ViewInject(R.id.vp_tab_top) private ViewPager vpTabPagerTop; @ViewInject(R.id.lv_tab_list) private RefreshListView lvTabList; @ViewInject(R.id.tv_news_title) private TextView tvNewsTitle; @ViewInject(R.id.indicator) private CirclePageIndicator indicator; private String mUrl; private TabData tabData;//页签数据 private ArrayList<TopNewsData> topNewsDatas;//头条新闻数据集合 private TopNewsData topNewsData;//头条新闻数据 private ArrayList<TabNewsData> tabNewsDatas;//新闻列表对象 private View newTopView;//新闻顶部广告条 public TabDetailPager(Activity mActivity, NewsTabData newsTabDatas) { super(mActivity); this.mTabData = newsTabDatas; mUrl = GlobalVariables.BASE_URL + newsTabDatas.url; } @Override public View initView() { View view = View.inflate(mActivity, R.layout.tab_detail_pager, null); newTopView = View.inflate(mActivity, R.layout.new_top_ads, null); ViewUtils.inject(this, view); ViewUtils.inject(this, newTopView); //将头条新闻以头布局的形式加给listview lvTabList.addHeaderView(newTopView); //设置下拉刷新监听 lvTabList.setOnRefreshListener(new RefreshListView.OnRefreshListener() { @Override public void onReFresh() { getDataFromServer(); } }); return view; } @Override public void initData() { super.initData(); getDataFromServer(); } /** * 从服务器获取数据 */ public void getDataFromServer() { HttpUtils httpUtils = new HttpUtils(); httpUtils.send(HttpMethod.GET, mUrl, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { String result = responseInfo.result; System.out.print("从网络获取的子页签详情数据:" + result); //解析数据 paserData(result); //接口访问完后(请求完数据后),收起下拉刷新控件 lvTabList.onRefreshComplete(); } @Override public void onFailure(HttpException e, String msg) { Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show(); e.printStackTrace(); //接口访问完后(请求完数据后),收起下拉刷新控件 lvTabList.onRefreshComplete(); } }); } /** * 解析数据 * * @param result */ private void paserData(String result) { Gson gson = new Gson(); tabData = gson.fromJson(result, TabData.class); topNewsDatas = tabData.data.topnews; if (topNewsDatas != null) { vpTabPagerTop.setAdapter(new NewsTopAdapter()); indicator.setOnPageChangeListener(this); indicator.setSnap(true);//支持快照显示 indicator.onPageSelected(0);//让指示器重新定位到第一个点 indicator.setViewPager(vpTabPagerTop); tvNewsTitle.setText(topNewsDatas.get(0).title); } tabNewsDatas = tabData.data.news; if (tabNewsDatas != null) { lvTabList.setAdapter(new NewsItemAdapter()); } } private class NewsItemAdapter extends BaseAdapter { private BitmapUtils bitmapUtils; public NewsItemAdapter() { bitmapUtils = new BitmapUtils(mActivity); } @Override public int getCount() { return tabNewsDatas.size(); } @Override public TabNewsData getItem(int position) { return tabNewsDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView==null){ convertView = View.inflate(mActivity,R.layout.new_list_item,null); viewHolder = new ViewHolder(); viewHolder.ivNewIcon = (ImageView) convertView.findViewById(R.id.iv_pic); viewHolder.tvNewTitle = (TextView) convertView.findViewById(R.id.tv_title); viewHolder.tvNewDate = (TextView) convertView.findViewById(R.id.tv_date); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.tvNewTitle.setText(getItem(position).title); viewHolder.tvNewDate.setText(getItem(position).pubdate); bitmapUtils.display(viewHolder.ivNewIcon,getItem(position).listimage); return convertView; } } static class ViewHolder{ ImageView ivNewIcon; TextView tvNewTitle; TextView tvNewDate; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { tvNewsTitle.setText(topNewsDatas.get(position).title); } @Override public void onPageScrollStateChanged(int state) { } /** * 新闻头条适配器 */ private class NewsTopAdapter extends PagerAdapter { private BitmapUtils bitmapUtils; public NewsTopAdapter() { bitmapUtils = new BitmapUtils(mActivity); bitmapUtils.configDefaultLoadingImage(R.drawable.topnews_item_default);//设置默认图片 } @Override public int getCount() { return topNewsDatas.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(mActivity); imageView.setScaleType(ImageView.ScaleType.FIT_XY);//基于控件大小填充图片 topNewsData = topNewsDatas.get(position); bitmapUtils.display(imageView, topNewsData.topimage);//传递imageView对象和图片地址 container.addView(imageView); System.out.println("topNews:" + position); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }运行效果:
新闻列表下拉加载数据
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"> <ProgressBar android:id="@+id/pb_pull_list_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:indeterminateDrawable="@drawable/custom_progress" /> <TextView android:id="@+id/tv_pull_list_header_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载中..." android:textColor="#f00" android:textSize="18sp"/> </LinearLayout>效果图:
RefreshListView.java
package com.xbmu.wisdombj.view; import android.content.Context; import android.os.SystemClock; 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.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.xbmu.wisdombj.R; import java.text.SimpleDateFormat; import java.util.Date; /** * 上拉刷新数据,下拉加载数据的ListView * Created by Administrator on 2016/2/10 0010. */ public class RefreshListView extends ListView implements AbsListView.OnScrollListener { private static final int STATE_PULL_REFRESH = 0;//下拉刷新 private static final int STATE_RELEASE_REFRESH = 1;//松开刷新 private static final int STATE_REFRESHING = 2;//正在刷新 private int mCurrentState = STATE_PULL_REFRESH;//当前状态 private int mHeaderViewHeight;//头布局的高度 private int startY = -1;//滑动起点的y坐标 private int endY; private View mHeaderView; private TextView tvTitle; private TextView tvTime; private ImageView ivArrow; private ProgressBar pbProgress; private String currentTime; private RotateAnimation animUp; private RotateAnimation animDown; private View mFooterView; private int mFooterViewHeight; public RefreshListView(Context context) { super(context); initHeaderView(); initFooterView(); } public RefreshListView(Context context, AttributeSet attrs) { super(context, attrs); initHeaderView(); initFooterView(); } public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initHeaderView(); initFooterView(); } /** * 初始化脚布局 */ private void initFooterView() { mFooterView = View.inflate(getContext(), R.layout.refresh_listview_footer, null); this.addFooterView(mFooterView); mFooterView.measure(0, 0); mFooterViewHeight = mFooterView.getMeasuredHeight(); mFooterView.setPadding(0, -mFooterViewHeight, 0, 0);//隐藏 this.setOnScrollListener(this); } /** * 初始化头布局 */ private void initHeaderView() { mHeaderView = View.inflate(getContext(), R.layout.refresh_header, null); this.addHeaderView(mHeaderView); tvTitle = (TextView) mHeaderView.findViewById(R.id.tv_title); tvTime = (TextView) mHeaderView.findViewById(R.id.tv_time); ivArrow = (ImageView) mHeaderView.findViewById(R.id.iv_arr); pbProgress = (ProgressBar) mHeaderView.findViewById(R.id.pb_progress); mHeaderView.measure(0, 0);//测量视图大小 mHeaderViewHeight = mHeaderView.getMeasuredHeight();//获得视图的高度 mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);//隐藏头布局 initArrowAnim(); tvTime.setText("最后刷新时间:" + getCurrentTime()); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: startY = (int) ev.getRawY(); break; case MotionEvent.ACTION_MOVE: if (startY == -1) {//确保startY有效 startY = (int) ev.getRawY(); } endY = (int) ev.getRawY(); int dy = endY - startY;//移动偏移量 if (dy > 0 && getFirstVisiblePosition() == 0) { //偏移量大于0 并且当前是第一个item,才允许下拉 int padding = dy - mHeaderViewHeight;//计算padding mHeaderView.setPadding(0, padding, 0, 0);//设置当前padding if (padding > 0 && mCurrentState != STATE_RELEASE_REFRESH) {//状态改为松开刷新 mCurrentState = STATE_RELEASE_REFRESH; refreshState(); } else if (padding < 0 && mCurrentState != STATE_PULL_REFRESH) {//改为下来刷新状态 mCurrentState = STATE_PULL_REFRESH; refreshState(); } return true; } break; case MotionEvent.ACTION_UP: startY = -1;//重置 if (mCurrentState == STATE_RELEASE_REFRESH) { mCurrentState = STATE_REFRESHING;//正在刷新 mHeaderView.setPadding(0, 0, 0, 0);//显示 refreshState(); } else if (mCurrentState == STATE_PULL_REFRESH) { mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);//隐藏 } break; default: break; } return super.onTouchEvent(ev); } /** * 定义一个刷新的接口 */ public interface OnRefreshListener { /** * 刷新 */ void onReFresh(); /** * 加载下一页数据 */ void onLoadMore(); } OnRefreshListener mListener; /** * 设置刷新的监听事件 */ public void setOnRefreshListener(OnRefreshListener listener) { mListener = listener; } /** * 刷新下拉控件的布局 */ private void refreshState() { switch (mCurrentState) { case STATE_PULL_REFRESH: tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animDown); break; case STATE_RELEASE_REFRESH: tvTitle.setText("松开刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); ivArrow.startAnimation(animUp); break; case STATE_REFRESHING: tvTitle.setText("正在刷新..."); ivArrow.clearAnimation();//必须先清除动画,才能隐藏 ivArrow.setVisibility(View.INVISIBLE); pbProgress.setVisibility(View.VISIBLE); //调用刷新接口 if (mListener != null) { mListener.onReFresh(); } break; default: break; } } /** * 初始化箭头动画 */ private void initArrowAnim() { //箭头向上动画 animUp = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animUp.setDuration(200); animUp.setFillAfter(true); //箭头向下动画 animDown = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animDown.setDuration(200); animDown.setFillAfter(true); } private boolean isLoadingMore;//是否加载更多 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_FLING || scrollState == SCROLL_STATE_IDLE) { if (getLastVisiblePosition() == getCount() - 1) {//滑动到最后 System.out.println("到底了..."); mFooterView.setPadding(0, 0, 0, 0);//显示 setSelection(getCount() - 1);//改变listview显示位置 isLoadingMore = true; if (mListener != null) { mListener.onLoadMore(); } } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } /** * 收起下拉刷新的控件 */ public void onRefreshComplete(boolean success) { if (isLoadingMore) { mFooterView.setPadding(0, -mFooterViewHeight, 0, 0);//隐藏脚布局 isLoadingMore = false; } else { SystemClock.sleep(500); mCurrentState = STATE_PULL_REFRESH; tvTitle.setText("下拉刷新"); ivArrow.setVisibility(View.VISIBLE); pbProgress.setVisibility(View.INVISIBLE); mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);//隐藏 if (success) { tvTime.setText("最后刷新时间:" + getCurrentTime()); } } } /** * 获取当前时间 * * @return */ public String getCurrentTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(new Date()); } }TabDetailPager.java
package com.xbmu.wisdombj.base; import android.app.Activity; import android.os.SystemClock; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import com.lidroid.xutils.http.client.HttpRequest.HttpMethod; import com.lidroid.xutils.view.annotation.ViewInject; import com.viewpagerindicator.CirclePageIndicator; import com.xbmu.wisdombj.R; import com.xbmu.wisdombj.bean.NewsData.NewsTabData; import com.xbmu.wisdombj.bean.TabData; import com.xbmu.wisdombj.bean.TabData.TabNewsData; import com.xbmu.wisdombj.bean.TabData.TopNewsData; import com.xbmu.wisdombj.global.GlobalVariables; import com.xbmu.wisdombj.view.RefreshListView; import java.util.ArrayList; /** * 页签详情页,表示每一个页签的对象 * Created by Administrator on 2016/2/7 0007. */ public class TabDetailPager extends BaseNewsDetailPager implements ViewPager.OnPageChangeListener { private NewsTabData mTabData;//新闻的 11个子标签标题 @ViewInject(R.id.vp_tab_top) private ViewPager vpTabPagerTop; @ViewInject(R.id.lv_tab_list) private RefreshListView lvTabList; @ViewInject(R.id.tv_news_title) private TextView tvNewsTitle; @ViewInject(R.id.indicator) private CirclePageIndicator indicator; private String mUrl; private TabData tabData;//页签数据 private ArrayList<TopNewsData> topNewsDatas;//头条新闻数据集合 private TopNewsData topNewsData;//头条新闻数据 private ArrayList<TabNewsData> tabNewsDatas;//新闻列表对象 private View newTopView;//新闻顶部广告条 private String mMoreUrl;//更多页面的地址 private NewsItemAdapter newsItemAdapter; public TabDetailPager(Activity mActivity, NewsTabData newsTabDatas) { super(mActivity); this.mTabData = newsTabDatas; mUrl = GlobalVariables.BASE_URL + newsTabDatas.url; } @Override public View initView() { View view = View.inflate(mActivity, R.layout.tab_detail_pager, null); newTopView = View.inflate(mActivity, R.layout.new_top_ads, null); ViewUtils.inject(this, view); ViewUtils.inject(this, newTopView); //将头条新闻以头布局的形式加给listview lvTabList.addHeaderView(newTopView); //设置下拉刷新监听 lvTabList.setOnRefreshListener(new RefreshListView.OnRefreshListener() { @Override public void onReFresh() { getDataFromServer(); } @Override public void onLoadMore() { if(mMoreUrl != null){ getMoreDataFromServer(); }else{ Toast.makeText(mActivity,"最后一页了",Toast.LENGTH_LONG).show(); lvTabList.onRefreshComplete(false);//收起加载更多的布局 } } }); return view; } @Override public void initData() { super.initData(); getDataFromServer(); } /** * 加载下一页数据 */ private void getMoreDataFromServer() { HttpUtils httpUtil = new HttpUtils(); httpUtil.send(HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { String result = responseInfo.result; paserData(result,true); lvTabList.onRefreshComplete(true); } @Override public void onFailure(HttpException e, String msg) { Toast.makeText(mActivity,msg,Toast.LENGTH_SHORT).show(); e.printStackTrace(); lvTabList.onRefreshComplete(false); } }); } /** * 从服务器获取数据 */ public void getDataFromServer() { HttpUtils httpUtils = new HttpUtils(); httpUtils.send(HttpMethod.GET, mUrl, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { String result = responseInfo.result; System.out.print("从网络获取的子页签详情数据:" + result); //解析数据 paserData(result,false); //接口访问完后(请求完数据后),收起下拉刷新控件 lvTabList.onRefreshComplete(true); } @Override public void onFailure(HttpException e, String msg) { Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show(); e.printStackTrace(); //接口访问完后(请求完数据后),收起下拉刷新控件 lvTabList.onRefreshComplete(false); } }); } /** * 解析数据 * * @param result */ private void paserData(String result,boolean isMore) { Gson gson = new Gson(); tabData = gson.fromJson(result, TabData.class); //处理下一页链接 String more = tabData.data.more; if(!TextUtils.isEmpty(more)){ mMoreUrl = GlobalVariables.BASE_URL + more; }else{ mMoreUrl = null; } if(!isMore){ topNewsDatas = tabData.data.topnews; tabNewsDatas = tabData.data.news; if (topNewsDatas != null) { vpTabPagerTop.setAdapter(new NewsTopAdapter()); indicator.setOnPageChangeListener(this); indicator.setSnap(true);//支持快照显示 indicator.onPageSelected(0);//让指示器重新定位到第一个点 indicator.setViewPager(vpTabPagerTop); tvNewsTitle.setText(topNewsDatas.get(0).title); } if (tabNewsDatas != null) { newsItemAdapter = new NewsItemAdapter(); lvTabList.setAdapter(newsItemAdapter); } }else{ //如果是加载下一页,需要将数据追加给原来的集合 ArrayList<TabNewsData> news = tabData.data.news; tabNewsDatas.addAll(news); newsItemAdapter.notifyDataSetChanged(); } } private class NewsItemAdapter extends BaseAdapter { private BitmapUtils bitmapUtils; public NewsItemAdapter() { bitmapUtils = new BitmapUtils(mActivity); } @Override public int getCount() { return tabNewsDatas.size(); } @Override public TabNewsData getItem(int position) { return tabNewsDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView==null){ convertView = View.inflate(mActivity,R.layout.new_list_item,null); viewHolder = new ViewHolder(); viewHolder.ivNewIcon = (ImageView) convertView.findViewById(R.id.iv_pic); viewHolder.tvNewTitle = (TextView) convertView.findViewById(R.id.tv_title); viewHolder.tvNewDate = (TextView) convertView.findViewById(R.id.tv_date); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.tvNewTitle.setText(getItem(position).title); viewHolder.tvNewDate.setText(getItem(position).pubdate); bitmapUtils.display(viewHolder.ivNewIcon,getItem(position).listimage); return convertView; } } static class ViewHolder{ ImageView ivNewIcon; TextView tvNewTitle; TextView tvNewDate; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { tvNewsTitle.setText(topNewsDatas.get(position).title); } @Override public void onPageScrollStateChanged(int state) { } /** * 新闻头条适配器 */ private class NewsTopAdapter extends PagerAdapter { private BitmapUtils bitmapUtils; public NewsTopAdapter() { bitmapUtils = new BitmapUtils(mActivity); bitmapUtils.configDefaultLoadingImage(R.drawable.topnews_item_default);//设置默认图片 } @Override public int getCount() { return topNewsDatas.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(mActivity); imageView.setScaleType(ImageView.ScaleType.FIT_XY);//基于控件大小填充图片 topNewsData = topNewsDatas.get(position); bitmapUtils.display(imageView, topNewsData.topimage);//传递imageView对象和图片地址 container.addView(imageView); System.out.println("topNews:" + position); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }运行效果:
相关文章推荐
- ELK Stack搭建和使用中的一些小记录
- ubuntu下设置环境变量的三种方法【转】
- apache commons io 发行审查工具结果
- 关于DreamWeaver CS6.0 + PhoneGap 之移动开发环境搭建
- Linux内核的起步
- 2016.2.11
- vmstat命令各项解释
- Git远程操作详解
- Android音乐播放器高级开发
- 微信导致手机死机 、 挂起 、 无响应 、反复重启
- Linux进程 -- wait/waitpid函数
- 基于lnmp搭建discuz论坛登陆管理员页面的双重认证
- apache commons io 可靠性报告
- #学习笔记#(39)JS随机颜色
- zabbix监控windows客户端的方法(随便耍耍)
- Spring10种常见异常解决方法
- python——动态类型简介
- 文件流的处理 C C++
- hdoj5621KK's Point
- Servlet工作原理(转)