Android开发实战《智慧北京》——5.shareSDK的使用

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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赈川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值