新华BBC笔记四

  • 布局文件
  • 初始化脚布局

    /**
     * 初始化脚布局
     */
    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);
    }
    
  • 监听是否滑动到底部

    /**
     * 滑动状态发生变化
     */
    @Override
    public 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点击
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(parent, view, position
                    - getHeaderViewsCount(), id);// 将原始position减去HeaderView的数量,才是准确的position
        }
    }
    
    /**
     * 处理Item点击事件
     */
    @Override
    public 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();// 刷新ListView
    mNewsAdapter.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);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值