文章目录

1.修改网页字体大小

现在加载出网页了,就需要开始实现界面中右上角第一个“调整字体大小”的功能

  1. 修改NewsDetailActivity,实现onClickListener接口,并且实现界面上两个按钮的点击方法onClick(),代码如下:
package com.example.zhbj;

import android.app.Activity;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
* 新闻详情页
*/
public class NewsDetailActivity extends Activity implements View.OnClickListener {

/**
* 返回按钮
*/
@ViewInject(R.id.btn_back)
private ImageButton btnBack;

/**
* 菜单按钮
*/
@ViewInject(R.id.btn_menu)
private ImageButton btnMenu;

/**
* 包含两个功能按钮的线性布局
*/
@ViewInject(R.id.ll_control)
private LinearLayout llControl;

/**
* 字体大小按钮
*/
@ViewInject(R.id.btn_textsize)
private ImageButton btnTextSize;

/**
* 分享按钮
*/
@ViewInject(R.id.btn_share)
private ImageButton btnShare;

/**
* WebView的实例
*/
@ViewInject(R.id.webview)
private WebView mWebView;

/**
* 进度条实例
*/
@ViewInject(R.id.pb_loading3)
private ProgressBar pbLoading;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_news_detail);
ViewUtils.inject(this);
initViews();

// 获取WebView的设置对象
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true); // 启用js功能
settings.setBuiltInZoomControls(true); // 启用显示放大/缩小的按钮,不支持已经适配好移动端的页面
settings.setUseWideViewPort(true); // 启用双击缩放
// 给WebView设置一个监听
mWebView.setWebViewClient(new WebViewClient(){
/**
* 页面开始加载
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pbLoading.setVisibility(View.VISIBLE);
}

/**
* 跳转链接
* @param view
* @param url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 强制所有跳转链接都在WebView执行
mWebView.loadUrl(url);
return true;
}

/**
* 加载结束
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pbLoading.setVisibility(View.GONE);
}
});
mWebView.setWebChromeClient(new WebChromeClient(){

/**
* 获取网页标题
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}

/**
* 进度发生变化
* @param view
* @param newProgress
*/
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
});

String url = getIntent().getStringExtra("url");

// 开始加载网页
mWebView.loadUrl(url);
}

/**
* 初始化布局
*/
private void initViews() {
btnBack.setVisibility(View.VISIBLE);
btnMenu.setVisibility(View.GONE);
llControl.setVisibility(View.VISIBLE);
btnBack.setOnClickListener(this);
btnMenu.setOnClickListener(this);

}

/**
* 拦截物理返回键
*/
@Override
public void onBackPressed() {
if (mWebView.canGoBack()){ // 判断是否可以返回
mWebView.goBack(); // 返回上一个网页
// mWebView.goForward(); 跳到下一个网页(前提是有一个历史记录)
// mWebView.canGoForward(); 判断是否可以跳转到下一个网页
}
else {
finish();
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_back:
finish();
break;
case R.id.btn_textsize:

break;
case R.id.btn_share:

break;
default:
break;
}
}
}
  1. 修改NewsDetailActivity,新增showChooseDialog()方法,表示选择字体的窗口,并且实现相应方法,代码如下:
package com.example.zhbj;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

import cn.sharesdk.onekeyshare.OnekeyShare;

/**
* 新闻详情页
*/
public class NewsDetailActivity extends Activity implements View.OnClickListener {

/**
* 返回按钮
*/
@ViewInject(R.id.btn_back)
private ImageButton btnBack;

/**
* 菜单按钮
*/
@ViewInject(R.id.btn_menu)
private ImageButton btnMenu;

/**
* 包含两个功能按钮的线性布局
*/
@ViewInject(R.id.ll_control)
private LinearLayout llControl;

/**
* 字体大小按钮
*/
@ViewInject(R.id.btn_textsize)
private ImageButton btnTextSize;

/**
* 分享按钮
*/
@ViewInject(R.id.btn_share)
private ImageButton btnShare;

/**
* WebView的实例
*/
@ViewInject(R.id.webview)
private WebView mWebView;

/**
* 进度条实例
*/
@ViewInject(R.id.pb_loading3)
private ProgressBar pbLoading;

/**
* 选中的字体大小标识符
*/
private int mTempWhich;

/**
* 当前选中的字体大小标识符
*/
private int mCurrentWhich = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_news_detail);
ViewUtils.inject(this);
initViews();

// 获取WebView的设置对象
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true); // 启用js功能
settings.setBuiltInZoomControls(true); // 启用显示放大/缩小的按钮,不支持已经适配好移动端的页面
settings.setUseWideViewPort(true); // 启用双击缩放
// 给WebView设置一个监听
mWebView.setWebViewClient(new WebViewClient(){
/**
* 页面开始加载
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pbLoading.setVisibility(View.VISIBLE);
}

/**
* 跳转链接
* @param view
* @param url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 强制所有跳转链接都在WebView执行
mWebView.loadUrl(url);
return true;
}

/**
* 加载结束
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pbLoading.setVisibility(View.GONE);
}
});
mWebView.setWebChromeClient(new WebChromeClient(){

/**
* 获取网页标题
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}

/**
* 进度发生变化
* @param view
* @param newProgress
*/
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
});

String url = getIntent().getStringExtra("url");

// 开始加载网页
mWebView.loadUrl(url);
}

/**
* 初始化布局
*/
private void initViews() {
btnBack.setVisibility(View.VISIBLE);
btnMenu.setVisibility(View.GONE);
llControl.setVisibility(View.VISIBLE);
btnBack.setOnClickListener(this);
btnMenu.setOnClickListener(this);
btnTextSize.setOnClickListener(this);
btnShare.setOnClickListener(this);
}

/**
* 拦截物理返回键
*/
@Override
public void onBackPressed() {
if (mWebView.canGoBack()){ // 判断是否可以返回
mWebView.goBack(); // 返回上一个网页
// mWebView.goForward(); 跳到下一个网页(前提是有一个历史记录)
// mWebView.canGoForward(); 判断是否可以跳转到下一个网页
}
else {
finish();
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_back:
finish();
break;
case R.id.btn_textsize:
showChooseDialog();
break;
case R.id.btn_share:
showShare();
break;
default:
break;
}
}

/**
* 显示选择字体的弹窗
*/
private void showChooseDialog() {
System.out.println("调用了方法");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("字体设置");
String[] items = new String[]{"超大号字体","大号字体","正常字体","小号字体","超小号字体"};
// 显示单选框,参数1:单选字符串数组;参数2:当前默认选中的位置;参数3:选中的监听器
builder.setSingleChoiceItems(items, mCurrentWhich, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTempWhich = which;
}
});

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
WebSettings settings = mWebView.getSettings();
switch (mTempWhich){
case 0:
// 超大号字体
settings.setTextSize(WebSettings.TextSize.LARGEST);
break;
case 1:
// 大号字体
settings.setTextSize(WebSettings.TextSize.LARGER);
break;
case 2:
// 正常字体
settings.setTextSize(WebSettings.TextSize.NORMAL);
break;
case 3:
// 小号字体
settings.setTextSize(WebSettings.TextSize.SMALLER);
break;
case 4:
// 超小号字体
settings.setTextSize(WebSettings.TextSize.SMALLEST);
break;
default:
break;
}
mCurrentWhich = mTempWhich;
}
});

builder.setNegativeButton("取消",null);

builder.show();
}

/**
* ShareSDK的分享方法
*/
private void showShare() {
OnekeyShare oks = new OnekeyShare();
// title标题,微信、QQ和QQ空间等平台使用
oks.setTitle("分享");
// titleUrl QQ和QQ空间跳转链接
oks.setTitleUrl("http://sharesdk.cn");
// text是分享文本,所有平台都需要这个字段
oks.setText("我是分享文本");
// imagePath是图片的本地路径,确保SDcard下面存在此张图片
oks.setImagePath("/sdcard/test.jpg");
// url在微信、Facebook等平台中使用
oks.setUrl("http://sharesdk.cn");
// 启动分享GUI
oks.show(this);
}
}

2.ShareSDK的使用

现在加载出网页了,就需要开始实现界面中右上角第二个“调整字体将”的功能,这里要使用一个第三方的框架——ShareSDK

  1. 前往ShareSDK的官网下载,按照指定提示,根据自己的需求来添加相应依赖,并且在线下载ShareSDK,可以参考官方文档进行集成,网站如此:http://www.mob.com/wiki/detailed?wiki=ShareSDK_Android_Title_ksjc&id=14 ,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWTM89hX-1580128885066)(C:\Users\moxitao\AppData\Roaming\Typora\typora-user-images\image-20200127173345619.png)]

  1. 修改NewsDetailActivity,添加ShareSDK的官方实例showShare()方法,记得在sdcard目录下添加图片,代码如下:
package com.example.zhbj;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

import cn.sharesdk.onekeyshare.OnekeyShare;

/**
* 新闻详情页
*/
public class NewsDetailActivity extends Activity implements View.OnClickListener {

/**
* 返回按钮
*/
@ViewInject(R.id.btn_back)
private ImageButton btnBack;

/**
* 菜单按钮
*/
@ViewInject(R.id.btn_menu)
private ImageButton btnMenu;

/**
* 包含两个功能按钮的线性布局
*/
@ViewInject(R.id.ll_control)
private LinearLayout llControl;

/**
* 字体大小按钮
*/
@ViewInject(R.id.btn_textsize)
private ImageButton btnTextSize;

/**
* 分享按钮
*/
@ViewInject(R.id.btn_share)
private ImageButton btnShare;

/**
* WebView的实例
*/
@ViewInject(R.id.webview)
private WebView mWebView;

/**
* 进度条实例
*/
@ViewInject(R.id.pb_loading3)
private ProgressBar pbLoading;

/**
* 选中的字体大小标识符
*/
private int mTempWhich;

/**
* 当前选中的字体大小标识符
*/
private int mCurrentWhich = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_news_detail);
ViewUtils.inject(this);
initViews();

// 获取WebView的设置对象
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true); // 启用js功能
settings.setBuiltInZoomControls(true); // 启用显示放大/缩小的按钮,不支持已经适配好移动端的页面
settings.setUseWideViewPort(true); // 启用双击缩放
// 给WebView设置一个监听
mWebView.setWebViewClient(new WebViewClient(){
/**
* 页面开始加载
* @param view
* @param url
* @param favicon
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pbLoading.setVisibility(View.VISIBLE);
}

/**
* 跳转链接
* @param view
* @param url
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 强制所有跳转链接都在WebView执行
mWebView.loadUrl(url);
return true;
}

/**
* 加载结束
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pbLoading.setVisibility(View.GONE);
}
});
mWebView.setWebChromeClient(new WebChromeClient(){

/**
* 获取网页标题
* @param view
* @param title
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}

/**
* 进度发生变化
* @param view
* @param newProgress
*/
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
});

String url = getIntent().getStringExtra("url");

// 开始加载网页
mWebView.loadUrl(url);
}

/**
* 初始化布局
*/
private void initViews() {
btnBack.setVisibility(View.VISIBLE);
btnMenu.setVisibility(View.GONE);
llControl.setVisibility(View.VISIBLE);
btnBack.setOnClickListener(this);
btnMenu.setOnClickListener(this);
btnTextSize.setOnClickListener(this);
btnShare.setOnClickListener(this);
}

/**
* 拦截物理返回键
*/
@Override
public void onBackPressed() {
if (mWebView.canGoBack()){ // 判断是否可以返回
mWebView.goBack(); // 返回上一个网页
// mWebView.goForward(); 跳到下一个网页(前提是有一个历史记录)
// mWebView.canGoForward(); 判断是否可以跳转到下一个网页
}
else {
finish();
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_back:
finish();
break;
case R.id.btn_textsize:
showChooseDialog();
break;
case R.id.btn_share:
showShare();
break;
default:
break;
}
}

/**
* 显示选择字体的弹窗
*/
private void showChooseDialog() {
System.out.println("调用了方法");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("字体设置");
String[] items = new String[]{"超大号字体","大号字体","正常字体","小号字体","超小号字体"};
// 显示单选框,参数1:单选字符串数组;参数2:当前默认选中的位置;参数3:选中的监听器
builder.setSingleChoiceItems(items, mCurrentWhich, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTempWhich = which;
}
});

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
WebSettings settings = mWebView.getSettings();
switch (mTempWhich){
case 0:
// 超大号字体
settings.setTextSize(WebSettings.TextSize.LARGEST);
break;
case 1:
// 大号字体
settings.setTextSize(WebSettings.TextSize.LARGER);
break;
case 2:
// 正常字体
settings.setTextSize(WebSettings.TextSize.NORMAL);
break;
case 3:
// 小号字体
settings.setTextSize(WebSettings.TextSize.SMALLER);
break;
case 4:
// 超小号字体
settings.setTextSize(WebSettings.TextSize.SMALLEST);
break;
default:
break;
}
mCurrentWhich = mTempWhich;
}
});

builder.setNegativeButton("取消",null);

builder.show();
}

/**
* ShareSDK的分享方法
*/
private void showShare() {
OnekeyShare oks = new OnekeyShare();
// title标题,微信、QQ和QQ空间等平台使用
oks.setTitle("分享");
// titleUrl QQ和QQ空间跳转链接
oks.setTitleUrl("http://sharesdk.cn");
// text是分享文本,所有平台都需要这个字段
oks.setText("我是分享文本");
// imagePath是图片的本地路径,确保SDcard下面存在此张图片
oks.setImagePath("/sdcard/test.jpg");
// url在微信、Facebook等平台中使用
oks.setUrl("http://sharesdk.cn");
// 启动分享GUI
oks.show(this);
}
}

3.头条新闻自动轮播

现在我们实现了这个应用的大体部分,接下来就是继续优化:让头条新闻实现自动轮播的效果

  1. 修改TabDetailPaper,修改processData()方法,使用Handler添加自动轮播的逻辑,代码如下:
package com.example.zhbj.base.impl;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.zhbj.NewsDetailActivity;
import com.example.zhbj.R;
import com.example.zhbj.base.BaseMenuDetailPaper;
import com.example.zhbj.domain.NewsMenu;
import com.example.zhbj.domain.NewsTab;
import com.example.zhbj.global.GlobalConstans;
import com.example.zhbj.util.CacheUtil;
import com.example.zhbj.util.PrefUtils;
import com.example.zhbj.view.RefreshListView;
import com.example.zhbj.view.TopNewsViewPaper;
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;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.viewpagerindicator.CirclePageIndicator;

import java.util.ArrayList;
import android.os.*;

/**
* 页签详情页,包含北京、中国、国际等页签
* ViewPagerIndicator
* 1.引入ViewPagerIndicator库
* 2.解决v4冲突,用大的版本覆盖小的版本
* 3.仿照sample中的程序进行拷贝SampleTabsDefault
*/
public class TabDetailPaper extends BaseMenuDetailPaper {

/**
* 当前页签数据
*/
private NewsMenu.NewsTabData newsTabData;

/**
* 文本框对象
*/
// private TextView view;

/**
* ViewPager对象
*/
@ViewInject(R.id.vp_tab_detail)
private TopNewsViewPaper mViewPaper;

/**
* 请求的URL地址
*/
private String mUrl;

/**
* 保存头条新闻图片的集合
*/
private ArrayList<NewsTab.TopNews> mTopNewsList;

/**
* TextView控件实例
*/
@ViewInject(R.id.tv_title2)
private TextView tvTitle;

/**
* Indicator控件实例
*/
@ViewInject(R.id.indicator2)
private CirclePageIndicator mIndicator;

/**
* ListView控件实例
*/
@ViewInject(R.id.lv_list)
private RefreshListView lvList;

/**
* 存储新闻列表的集合
*/
private ArrayList<NewsTab.News> mNewsList;

/**
* 加载更多信息的Url
*/
private String mMoreUrl;

/**
* 新闻详情的适配器
*/
private NewsAdapter mNewsAdapter;

/**
* Handler对象
*/
private Handler mHandler;

public TabDetailPaper(Activity activity, NewsMenu.NewsTabData newsTabData) {
super(activity);
this.newsTabData = newsTabData;
mUrl = GlobalConstans.SERVER_URL + newsTabData.url;
}

@Override
public View initViews() {
/*
view = new TextView(mActivity);
view.setTextSize(22);
view.setTextColor(Color.RED);
view.setGravity(Gravity.CENTER); // 居中显示
view.setText("页签");
*/
View view = View.inflate(mActivity,R.layout.paper_tab_detail,null);

// 加载头条新闻的头布局
View headerView = View.inflate(mActivity,R.layout.list_item_header,null);
ViewUtils.inject(this,view);
ViewUtils.inject(this,headerView);
lvList.addHeaderView(headerView); // 给ListView添加头布局

// 设置下拉刷新的监听
lvList.setOnRefreshListener(new RefreshListView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新数据
getDataFromServer();
}

@Override
public void onLoadMore() {
if (mMoreUrl != null){
getMoreDataFromServer();
}else {
Toast.makeText(mActivity,"没有更多数据啦",Toast.LENGTH_SHORT).show();
lvList.onRefreshComplete();
}
}
});

// 设置点击事件
lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 头布局也算位置,所以使用position时要将头布局个数减掉
int headerViewsCount = lvList.getHeaderViewsCount();
position -= headerViewsCount;
NewsTab.News news = mNewsList.get(position);

// 标记已读未读:将已读新闻id保存在sp中
// key: "read_ids"
// value: 11000,11001,11002...
// 读取现有的id
String readIds = PrefUtils.getString(mActivity, "read_ids", "");
if (!readIds.contains(news.id)){
// 在现有id基础上追加新的id
readIds = readIds + news.id + ",";
// 保存最新的id集合
PrefUtils.putString(mActivity,"read_ids",readIds);
}
// 刷新ListView,全局刷新
// mNewsAdapter.notifyDataSetChanged();
// 刷新ListView,局部刷新
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title3);
tvTitle.setTextColor(Color.GRAY);

// 跳到新闻详情页
Intent intent = new Intent(mActivity, NewsDetailActivity.class);
intent.putExtra("url",news.url); // 传递网页
mActivity.startActivity(intent);
}
});

return view;
}

@Override
public void initData() {
// view.setText(newsTabData.title); // 修改当前布局的数据
String cache = CacheUtil.getCache(mActivity, mUrl);
if (!TextUtils.isEmpty(cache)){
// 有缓存
processData(cache,false);
}
getDataFromServer();
}

/**
* 从服务器中获取数据
*/
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
processData(result,false);
CacheUtil.setCache(mActivity,mUrl,result);

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}

@Override
public void onFailure(HttpException e, String s) {
e.printStackTrace();
Toast.makeText(mActivity,s,Toast.LENGTH_SHORT).show();

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}
});
}

/**
* 从服务器中获取下一页数据
*/
private void getMoreDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
processData(result,true);

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}

@Override
public void onFailure(HttpException e, String s) {
e.printStackTrace();
Toast.makeText(mActivity,s,Toast.LENGTH_SHORT).show();

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}
});
}

private void processData(String result,boolean isMore) {
Gson gson = new Gson();
NewsTab newsTab = gson.fromJson(result, NewsTab.class);

// 获取下一页的数据地址
String more = newsTab.data.more;
if (!TextUtils.isEmpty(more)){
mMoreUrl = GlobalConstans.SERVER_URL + more;
}
else {
mMoreUrl = null;
}

if (!isMore){
// 初始化头条新闻数据
mTopNewsList = newsTab.data.topnews;
if (mTopNewsList != null){
mViewPaper.setAdapter(new TopNewsAdapter());
mIndicator.setViewPager(mViewPaper); // 将圆形指示器和viewpager绑定
mIndicator.setSnap(true); // 快照展示方式
mIndicator.onPageSelected(0); // 将圆点位置归零,保证圆点和页面同步
mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {

}

@Override
public void onPageSelected(int i) {
// 更新头条新闻的标题
tvTitle.setText(mTopNewsList.get(i).title);
}

@Override
public void onPageScrollStateChanged(int i) {

}
});

// 初始化首页标题
tvTitle.setText(mTopNewsList.get(0).title);

// 启动自动轮播效果
if (mHandler == null){
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
int currentPos = mViewPaper.getCurrentItem();
if (currentPos < mTopNewsList.size() - 1){
currentPos++;
}else {
currentPos = 0; // 如果已经是最后一页,重新从第一页开始
}
mViewPaper.setCurrentItem(currentPos);
mHandler.sendEmptyMessageDelayed(0,2000);
}
};

// 发送延迟消息,启动自动轮播
mHandler.sendEmptyMessageDelayed(0,2000);
}
}

/**
* 初始化新闻列表数据
*/
mNewsList = newsTab.data.news;
if (mNewsList != null){
mNewsAdapter = new NewsAdapter();
lvList.setAdapter(new NewsAdapter());
}
}else {
// 加载更多
ArrayList<NewsTab.News> moreNews = newsTab.data.news;
mNewsList.addAll(moreNews); // 追加更多数据
// 刷新listview
mNewsAdapter.notifyDataSetChanged();
}

}

class TopNewsAdapter extends PagerAdapter{

/**
* xUtils中的BitmapUtils工具类
*/
private BitmapUtils mBitmapUtils;

public TopNewsAdapter() {
mBitmapUtils = new BitmapUtils(mActivity);
// 设置加载中的默认图片
mBitmapUtils.configDefaultLoadingImage(R.drawable.pic_item_list_default);
}

@Override
public int getCount() {
return mTopNewsList.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView view = new ImageView(mActivity);
NewsTab.TopNews topNews = mTopNewsList.get(position);
String topimage = topNews.topimage; // 图片的下载链接

view.setScaleType(ImageView.ScaleType.FIT_XY); // 设置缩放模式:宽高匹配窗体
/**
* 1,根据url下载图片
* 2.将图片设置给ImageView
* 3.将图片作成缓存
* 4.避免内存溢出
* 由于工程量巨大,这里使用xUtils中的BitmapUtils里的api来完成这四个逻辑
*/
mBitmapUtils.display(view,topimage);

container.addView(view);
return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}

/**
* 新闻列表适配器
*/
class NewsAdapter extends BaseAdapter{

/**
* BitmapUtils工具类
*/
private BitmapUtils mBitmapUtils;

public NewsAdapter() {
mBitmapUtils = new BitmapUtils(mActivity);
mBitmapUtils.configDefaultLoadingImage(R.drawable.news_pic_default);
}

@Override
public int getCount() {
return mNewsList.size();
}

@Override
public NewsTab.News getItem(int position) {
return mNewsList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
convertView = View.inflate(mActivity,R.layout.list_item_news,null);
holder = new ViewHolder();
holder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title3);
holder.tvTime = (TextView) convertView.findViewById(R.id.tv_time);

convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
NewsTab.News info = getItem(position);
holder.tvTitle.setText(info.title);
holder.tvTime.setText(info.pubdate);
mBitmapUtils.display(holder.ivIcon,info.listimage);

// 判断已读未读
String readIds = PrefUtils.getString(mActivity, "read_ids", "");
if (readIds.contains(info.id)){
holder.tvTitle.setTextColor(Color.GRAY);
}
else {
holder.tvTitle.setTextColor(Color.BLACK);
}
return convertView;
}
}

static class ViewHolder{
public ImageView ivIcon;
public TextView tvTitle;
public TextView tvTime;
}

}
  1. 修改TabDetailPaper,修改processData()方法,创建VIewPager的点击监听器,用于让图片被点击或被拖拽的时候停止轮播,代码如下:
package com.example.zhbj.base.impl;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.zhbj.NewsDetailActivity;
import com.example.zhbj.R;
import com.example.zhbj.base.BaseMenuDetailPaper;
import com.example.zhbj.domain.NewsMenu;
import com.example.zhbj.domain.NewsTab;
import com.example.zhbj.global.GlobalConstans;
import com.example.zhbj.util.CacheUtil;
import com.example.zhbj.util.PrefUtils;
import com.example.zhbj.view.RefreshListView;
import com.example.zhbj.view.TopNewsViewPaper;
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;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.viewpagerindicator.CirclePageIndicator;

import java.util.ArrayList;
import android.os.*;

/**
* 页签详情页,包含北京、中国、国际等页签
* ViewPagerIndicator
* 1.引入ViewPagerIndicator库
* 2.解决v4冲突,用大的版本覆盖小的版本
* 3.仿照sample中的程序进行拷贝SampleTabsDefault
*/
public class TabDetailPaper extends BaseMenuDetailPaper {

/**
* 当前页签数据
*/
private NewsMenu.NewsTabData newsTabData;

/**
* 文本框对象
*/
// private TextView view;

/**
* ViewPager对象
*/
@ViewInject(R.id.vp_tab_detail)
private TopNewsViewPaper mViewPaper;

/**
* 请求的URL地址
*/
private String mUrl;

/**
* 保存头条新闻图片的集合
*/
private ArrayList<NewsTab.TopNews> mTopNewsList;

/**
* TextView控件实例
*/
@ViewInject(R.id.tv_title2)
private TextView tvTitle;

/**
* Indicator控件实例
*/
@ViewInject(R.id.indicator2)
private CirclePageIndicator mIndicator;

/**
* ListView控件实例
*/
@ViewInject(R.id.lv_list)
private RefreshListView lvList;

/**
* 存储新闻列表的集合
*/
private ArrayList<NewsTab.News> mNewsList;

/**
* 加载更多信息的Url
*/
private String mMoreUrl;

/**
* 新闻详情的适配器
*/
private NewsAdapter mNewsAdapter;

/**
* Handler对象
*/
private Handler mHandler;

public TabDetailPaper(Activity activity, NewsMenu.NewsTabData newsTabData) {
super(activity);
this.newsTabData = newsTabData;
mUrl = GlobalConstans.SERVER_URL + newsTabData.url;
}

@Override
public View initViews() {
/*
view = new TextView(mActivity);
view.setTextSize(22);
view.setTextColor(Color.RED);
view.setGravity(Gravity.CENTER); // 居中显示
view.setText("页签");
*/
View view = View.inflate(mActivity,R.layout.paper_tab_detail,null);

// 加载头条新闻的头布局
View headerView = View.inflate(mActivity,R.layout.list_item_header,null);
ViewUtils.inject(this,view);
ViewUtils.inject(this,headerView);
lvList.addHeaderView(headerView); // 给ListView添加头布局

// 设置下拉刷新的监听
lvList.setOnRefreshListener(new RefreshListView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新数据
getDataFromServer();
}

@Override
public void onLoadMore() {
if (mMoreUrl != null){
getMoreDataFromServer();
}else {
Toast.makeText(mActivity,"没有更多数据啦",Toast.LENGTH_SHORT).show();
lvList.onRefreshComplete();
}
}
});

// 设置点击事件
lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 头布局也算位置,所以使用position时要将头布局个数减掉
int headerViewsCount = lvList.getHeaderViewsCount();
position -= headerViewsCount;
NewsTab.News news = mNewsList.get(position);

// 标记已读未读:将已读新闻id保存在sp中
// key: "read_ids"
// value: 11000,11001,11002...
// 读取现有的id
String readIds = PrefUtils.getString(mActivity, "read_ids", "");
if (!readIds.contains(news.id)){
// 在现有id基础上追加新的id
readIds = readIds + news.id + ",";
// 保存最新的id集合
PrefUtils.putString(mActivity,"read_ids",readIds);
}
// 刷新ListView,全局刷新
// mNewsAdapter.notifyDataSetChanged();
// 刷新ListView,局部刷新
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title3);
tvTitle.setTextColor(Color.GRAY);

// 跳到新闻详情页
Intent intent = new Intent(mActivity, NewsDetailActivity.class);
intent.putExtra("url",news.url); // 传递网页
mActivity.startActivity(intent);
}
});

return view;
}

@Override
public void initData() {
// view.setText(newsTabData.title); // 修改当前布局的数据
String cache = CacheUtil.getCache(mActivity, mUrl);
if (!TextUtils.isEmpty(cache)){
// 有缓存
processData(cache,false);
}
getDataFromServer();
}

/**
* 从服务器中获取数据
*/
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
processData(result,false);
CacheUtil.setCache(mActivity,mUrl,result);

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}

@Override
public void onFailure(HttpException e, String s) {
e.printStackTrace();
Toast.makeText(mActivity,s,Toast.LENGTH_SHORT).show();

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}
});
}

/**
* 从服务器中获取下一页数据
*/
private void getMoreDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpRequest.HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
processData(result,true);

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}

@Override
public void onFailure(HttpException e, String s) {
e.printStackTrace();
Toast.makeText(mActivity,s,Toast.LENGTH_SHORT).show();

// 隐藏下拉刷新控件
lvList.onRefreshComplete();
}
});
}

private void processData(String result,boolean isMore) {
Gson gson = new Gson();
NewsTab newsTab = gson.fromJson(result, NewsTab.class);

// 获取下一页的数据地址
String more = newsTab.data.more;
if (!TextUtils.isEmpty(more)){
mMoreUrl = GlobalConstans.SERVER_URL + more;
}
else {
mMoreUrl = null;
}

if (!isMore){
// 初始化头条新闻数据
mTopNewsList = newsTab.data.topnews;
if (mTopNewsList != null){
mViewPaper.setAdapter(new TopNewsAdapter());
mIndicator.setViewPager(mViewPaper); // 将圆形指示器和viewpager绑定
mIndicator.setSnap(true); // 快照展示方式
mIndicator.onPageSelected(0); // 将圆点位置归零,保证圆点和页面同步
mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {

}

@Override
public void onPageSelected(int i) {
// 更新头条新闻的标题
tvTitle.setText(mTopNewsList.get(i).title);
}

@Override
public void onPageScrollStateChanged(int i) {

}
});

// 初始化首页标题
tvTitle.setText(mTopNewsList.get(0).title);

// 启动自动轮播效果
if (mHandler == null){
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
int currentPos = mViewPaper.getCurrentItem();
if (currentPos < mTopNewsList.size() - 1){
currentPos++;
}else {
currentPos = 0; // 如果已经是最后一页,重新从第一页开始
}
mViewPaper.setCurrentItem(currentPos);
mHandler.sendEmptyMessageDelayed(0,2000);
}
};

// 发送延迟消息,启动自动轮播
mHandler.sendEmptyMessageDelayed(0,2000);
}

mViewPaper.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mHandler.removeCallbacksAndMessages(null); // 移除消息,停止轮播
break;
case MotionEvent.ACTION_CANCEL:
// 事件取消
mHandler.sendEmptyMessageDelayed(0,2000);
break;
case MotionEvent.ACTION_UP:
mHandler.sendEmptyMessageDelayed(0,2000);
break;
default:
break;
}
return false;
}
});
}

/**
* 初始化新闻列表数据
*/
mNewsList = newsTab.data.news;
if (mNewsList != null){
mNewsAdapter = new NewsAdapter();
lvList.setAdapter(new NewsAdapter());
}
}else {
// 加载更多
ArrayList<NewsTab.News> moreNews = newsTab.data.news;
mNewsList.addAll(moreNews); // 追加更多数据
// 刷新listview
mNewsAdapter.notifyDataSetChanged();
}

}

class TopNewsAdapter extends PagerAdapter{

/**
* xUtils中的BitmapUtils工具类
*/
private BitmapUtils mBitmapUtils;

public TopNewsAdapter() {
mBitmapUtils = new BitmapUtils(mActivity);
// 设置加载中的默认图片
mBitmapUtils.configDefaultLoadingImage(R.drawable.pic_item_list_default);
}

@Override
public int getCount() {
return mTopNewsList.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView view = new ImageView(mActivity);
NewsTab.TopNews topNews = mTopNewsList.get(position);
String topimage = topNews.topimage; // 图片的下载链接

view.setScaleType(ImageView.ScaleType.FIT_XY); // 设置缩放模式:宽高匹配窗体
/**
* 1,根据url下载图片
* 2.将图片设置给ImageView
* 3.将图片作成缓存
* 4.避免内存溢出
* 由于工程量巨大,这里使用xUtils中的BitmapUtils里的api来完成这四个逻辑
*/
mBitmapUtils.display(view,topimage);

container.addView(view);
return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}

/**
* 新闻列表适配器
*/
class NewsAdapter extends BaseAdapter{

/**
* BitmapUtils工具类
*/
private BitmapUtils mBitmapUtils;

public NewsAdapter() {
mBitmapUtils = new BitmapUtils(mActivity);
mBitmapUtils.configDefaultLoadingImage(R.drawable.news_pic_default);
}

@Override
public int getCount() {
return mNewsList.size();
}

@Override
public NewsTab.News getItem(int position) {
return mNewsList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
convertView = View.inflate(mActivity,R.layout.list_item_news,null);
holder = new ViewHolder();
holder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title3);
holder.tvTime = (TextView) convertView.findViewById(R.id.tv_time);

convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
NewsTab.News info = getItem(position);
holder.tvTitle.setText(info.title);
holder.tvTime.setText(info.pubdate);
mBitmapUtils.display(holder.ivIcon,info.listimage);

// 判断已读未读
String readIds = PrefUtils.getString(mActivity, "read_ids", "");
if (readIds.contains(info.id)){
holder.tvTitle.setTextColor(Color.GRAY);
}
else {
holder.tvTitle.setTextColor(Color.BLACK);
}
return convertView;
}
}

static class ViewHolder{
public ImageView ivIcon;
public TextView tvTitle;
public TextView tvTime;
}

}