- 布局文件
初始化脚布局
/** * 初始化脚布局 */ 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个平台
步骤:
- 下载ShareSDK
- 运行SDK工具,生成项目包,进行覆盖
- 查看Android文档
- 创建应用, 生成appkey,替换项目中的appkey
- 拷贝相关权限和代码
- 注意sdcard根目录下需要有test.jpg这张图片,否则会分享失败
- 运行程序,进行测试
可以修改主题样式
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); } }