您的位置:首页 > 其它

智慧北京开发第四天(上)

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);
}
}
}
运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: