新华BBC笔记四

来源:互联网 发布:java object equals 编辑:程序博客网 时间:2024/04/29 22:20
  • 布局文件
  • 初始化脚布局

    /** * 初始化脚布局 */private void initFooterView() {    mFooterView = View.inflate(getContext(),            R.layout.refresh_listview_footer, null);    this.addFooterView(mFooterView);    mFooterView.measure(0, 0);// 测量View    mFooterHeight = mFooterView.getMeasuredHeight();    mFooterView.setPadding(0, -mFooterHeight, 0, 0);// 隐藏头布局    setOnScrollListener(this);}
  • 监听是否滑动到底部

    /** * 滑动状态发生变化 */@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {    // 快速滑动或者静止时    if (scrollState == SCROLL_STATE_IDLE            || scrollState == SCROLL_STATE_FLING) {        if (getLastVisiblePosition() == getCount() - 1 && !isLoadMore) {            LogUtils.d("到底部了");            isLoadMore = true;            mFooterView.setPadding(0, 0, 0, 0);            setSelection(getCount());// 设置ListView显示位置            if (mListener != null) {                mListener.onLoadMore();            }        }    }}
  • 加载更多回调方法

    /** * 下拉刷新的回调接口 *  * @author Kevin *  */public interface RefreshListener {    /**     * 下拉刷新的回调方法     */    public void onRefresh();    /**     * 加载更多的回调方法     */    public void onLoadMore();}
  • 加载完成

    /** * 当刷新完成后,隐藏下拉刷新控件, 初始化各项数据 */public void onRefreshComplete(boolean needUpdateTime) {    if (isLoadMore) {        isLoadMore = false;        mFooterView.setPadding(0, -mFooterHeight, 0, 0);// 隐藏脚布局    } }
  • 加载更多数据

    /** * 加载更多数据 */private void getMoreDataFromNet() {    if (mMoreUrl != null) {        HttpUtils utils = new HttpUtils();        utils.send(HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() {            @Override            public void onSuccess(ResponseInfo<String> responseInfo) {                processData(responseInfo.result, true);                lvList.onRefreshComplete(false);// 隐藏下拉刷新控件            }            @Override            public void onFailure(HttpException error, String msg) {                Log.e(TAG, "请求失败:" + msg);                lvList.onRefreshComplete(false);// 隐藏下拉刷新控件                Toast.makeText(mActivity, "加载更多失败", Toast.LENGTH_SHORT)                        .show();            }        });    } else {        lvList.onRefreshComplete(false);        Toast.makeText(mActivity, "没有更多数据了", Toast.LENGTH_SHORT).show();    }}
  • 解析更多数据

    protected void processData(String result, boolean more) {    Gson gson = new Gson();    TabDetailBean tabInfo = gson.fromJson(result, TabDetailBean.class);    if (!TextUtils.isEmpty(tabInfo.data.more)) {        mMoreUrl = GlobalContants.SERVER_URL + tabInfo.data.more;    } else {        mMoreUrl = null;    }    if (!more) {// 不加载更多        .....    } else {// 加载更多        ArrayList<News> news = tabInfo.data.news;        if (mNewsList != null) {            mNewsList.addAll(news);            mNewsAdapter.notifyDataSetChanged();        }    }}

Item点击

  • 获取Item点击事件(注意position变化)

    /** * 设置Item点击监听 */lvList.setOnItemClickListener(new OnItemClickListener() {    @Override    public void onItemClick(AdapterView<?> parent, View view,            int position, long id) {        Log.d(TAG, "Item点击:" + position);    }});----------------------------OnItemClickListener mItemClickListener;/** * 响应Item点击 */@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,        long id) {    if (mItemClickListener != null) {        mItemClickListener.onItemClick(parent, view, position                - getHeaderViewsCount(), id);// 将原始position减去HeaderView的数量,才是准确的position    }}/** * 处理Item点击事件 */@Overridepublic void setOnItemClickListener(        android.widget.AdapterView.OnItemClickListener listener) {    mItemListener = listener;    super.setOnItemClickListener(this);}
  • 标记已读未读

    String ids = SharePreferenceUtils.getString(mActivity,            PREF_NEWS_READ, "");if (!ids.contains(news.id)) {// 只有在不包含该id时才添加    ids = ids + news.id + ",";    SharePreferenceUtils.putString(mActivity, PREF_NEWS_READ, ids);// 更新已读id列表}// mNewsAdapter.notifyDataSetChanged();// 刷新ListViewmNewsAdapter.changeTextColor(view);// 局部刷新ListView-------------------if (ids.contains(getItem(position).id)) {// 如果再已读列表中    holder.tvTitle.setTextColor(Color.GRAY);} else {    holder.tvTitle.setTextColor(Color.BLACK);}-------------------/** * 局部刷新TextView *  * @param view 被点击的Item对象 */public void changeTextColor(View view) {    TextView tvTitle = (TextView) view.findViewById(R.id.tv_news_title);    tvTitle.setTextColor(Color.GRAY);}

新闻详情页

  • 页面跳转,传参

  • 布局

    • 标题(include)
  • WebView简介

    • 启用js
    • 启用缩放

      if (!TextUtils.isEmpty(mUrl)) {    WebSettings settings = mWebView.getSettings();    settings.setJavaScriptEnabled(true);// 打开js功能    settings.setBuiltInZoomControls(true);// 显示放大缩小的按钮    settings.setUseWideViewPort(true);// 双击缩放    // mWebView.loadUrl("http://www.itcast.cn");    mWebView.setWebViewClient(new WebViewClient() {        // 监听网页加载结束的事件        @Override        public void onPageFinished(WebView view, String url) {            mProgress.setVisibility(View.GONE);        }    });    mWebView.loadUrl(mUrl);}
    • 字体缩放

      • 字体选择对话框

        /** * 展示修改字体的对话框 */private void showChangeSizeDialog() {    AlertDialog.Builder builder = new AlertDialog.Builder(this);    String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",            "超小号字体" };    // 设置单选对话框    builder.setSingleChoiceItems(items, mSelectedSizeIndex,            new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialog, int which) {                    Log.d(TAG, "选中:" + which);                    mCurrentSizeIndex = which;                }            });    builder.setTitle("字体设置");// 设置标题    builder.setPositiveButton("确定", new AlertDialog.OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {            switch (mCurrentSizeIndex) {            case 0:                mWebView.getSettings().setTextSize(TextSize.LARGEST);// 设置WebView中字体的大小                break;            case 1:                mWebView.getSettings().setTextSize(TextSize.LARGER);                break;            case 2:                mWebView.getSettings().setTextSize(TextSize.NORMAL);                break;            case 3:                mWebView.getSettings().setTextSize(TextSize.SMALLER);                break;            case 4:                mWebView.getSettings().setTextSize(TextSize.SMALLEST);                break;            default:                break;            }            mSelectedSizeIndex = mCurrentSizeIndex;        }    });    builder.setNegativeButton("取消", null);    builder.show();}
    • 分享

      • ShareSDK

        官网: http://www.mob.com/ShareSDK是中国最大的APP内分享服务提供商,ShareSDK社会化分享全面支持微信,微博,QQ空间,来往,易信,Facebook等国内外40个平台

      步骤:

      1. 下载ShareSDK
      2. 运行SDK工具,生成项目包,进行覆盖
      3. 查看Android文档
      4. 创建应用, 生成appkey,替换项目中的appkey
      5. 拷贝相关权限和代码
      6. 注意sdcard根目录下需要有test.jpg这张图片,否则会分享失败
      7. 运行程序,进行测试
      8. 可以修改主题样式

        OnekeyShare oks.setTheme(OnekeyShareTheme.SKYBLUE);//设置主题样式

      注意:

      • 微博测试账号: vdisktest4@sina.cn, 12345678
      • QQ测试账号: 1810189557, itheima
      • zhbj48 appkey:5701c42963ec

轮播条

  • Handler机制

  • 轮播条实现

    if (mHandler == null) {        // 创建轮播条的Handler        mHandler = new Handler() {            public void handleMessage(android.os.Message msg) {                int item = mViewPager.getCurrentItem();                if (item < mTopNews.size() - 1) {                    item++;                } else {// 判断是否到达最后一个                    item = 0;                }                // Log.d(TAG, "轮播条:" + item);                mViewPager.setCurrentItem(item);                mHandler.sendMessageDelayed(Message.obtain(), 4000);            };        };        mHandler.sendMessageDelayed(Message.obtain(), 4000);// 延时4s发送消息}
  • 按住轮播条,停止轮播

    class TopNewsTouchListener implements OnTouchListener {    @Override    public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            Log.d(TAG, "手指按下");            mHandler.removeCallbacksAndMessages(null);// 移除消息队列中的所有元素            break;        case MotionEvent.ACTION_CANCEL:// 事件取消(比如按下后开始移动,                                        // 那么就不会响应ACTION_UP动作了)            Log.d(TAG, "事件取消");            mHandler.sendMessageDelayed(Message.obtain(),                    TOP_NEWS_CHANGE_TIME);            break;        case MotionEvent.ACTION_UP:            Log.d(TAG, "手指抬起");            mHandler.sendMessageDelayed(Message.obtain(),                    TOP_NEWS_CHANGE_TIME);            break;        default:            break;        }        return true;    }}
  • 轮播条点击事件处理(OnTouch事件被拦截后,就无法响应点击事件了.)

    image.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {        Intent intent = new Intent(mActivity,                NewsDetailActivity.class);        intent.putExtra("news_url", mTopNews.get(position).url);        mActivity.startActivity(intent);    }});

组图

  • 布局

     ListView + GridView + FrameLayout
  • 网络数据获取并解析

  • ListView数据填充

    • item布局实现
    • 数据填充
  • 标题栏切换按钮

    NewsCenterPager.java/** * 设置当前详情页面 *  * @param position */public void setCurrentDetailPager(int position) {    Log.d(TAG, "详情页面:" + position);    BaseMenuDetailPager detailPager = mMenuDetailPagers.get(position);    if (detailPager instanceof PhotosMenuDetailPager) {// 如果是组图页面,就展示组图切换按钮        btnPhotoSwitch.setVisibility(View.VISIBLE);    } else {        btnPhotoSwitch.setVisibility(View.GONE);    }    flContent.removeAllViews();// 填充界面前,先把以前的界面清空    flContent.addView(detailPager.mRootView);// 添加当前详情页的布局    detailPager.initData();// 初始化数据    tvTitle.setText(mLeftMenuList.get(position).title);}------------------------------------PhotosMenuDetailPager.java/** * 修改图片展现方式(ListView或者GridView) */private void switchPhotosDisplay() {    if (isListShow) {        isListShow = false;        lvList.setVisibility(View.GONE);        gvList.setVisibility(View.VISIBLE);        gvList.setAdapter(mAdapter);        btnPhotoSwitch.setImageResource(R.drawable.icon_pic_list_type);    } else {        isListShow = true;        lvList.setVisibility(View.VISIBLE);        gvList.setVisibility(View.GONE);        lvList.setAdapter(mAdapter);        btnPhotoSwitch.setImageResource(R.drawable.icon_pic_grid_type);    }}
0 0