360手机助手(二):侧拉栏drawerLayout+Tab+Viewpager+ListView+Pulltorefresh+imageloder

整个项目的框架在ContentPager,要熟悉这个类。

简介

完成侧拉栏的显示,侧拉首页对应的:首页+应用+游戏这3个 tab,包含的知识点有:请求数据 +pullTofresh + ImageLoader +轮播图 + listView

效果图:

侧拉栏的实现

V4包中的DrawerLayout实现侧拉效果,每个侧拉的item对应一个fragment,点击该item时,先把所有的fragment隐藏 + 文字设置未选中,然后才创建对应的fragment并显示

怎么实现侧拉栏的显示与隐藏?

点击ActionBar的导航图标实现侧拉栏的显示与隐藏。先要获取ActionBar和DrawerLayout,再创建ActionBarDrawerToggle并设置导航图标,最后给drawerlayout添加侧栏监听及toggle,当然要想侧栏栏出现,还要在onOptionsItemSelected()方法中加这一行代码:toggle.onOptionsItemSelected(item);

private void initDrawerLayout() {
    drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    // 创建监听对(ActionBarDrawerToggle 实现了DrawerLayout.DrawerListener),添加导航图标
    toggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer_am, 0, 0);
    toggle.syncState();// 少了这一行,ic_drawer_am就是默认的图标,不是我们指定的。
    drawerLayout.setDrawerListener(toggle);
}

/**
 * 要想侧栏栏出现,还要加这一行代码:toggle.onOptionsItemSelected(item);
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    toggle.onOptionsItemSelected(item);
    return super.onOptionsItemSelected(item);
}

ActionBar的设置

private void initActionBar() {
    ActionBar actionBar = getSupportActionBar();
    actionBar.setIcon(R.drawable.ic_launcher);// 设置home图标
    actionBar.setDisplayShowHomeEnabled(true);// 显示home图标
    actionBar.setHomeButtonEnabled(true);// home图标可点击
    actionBar.setDisplayHomeAsUpEnabled(true);// 显示导航图标
}

侧栏按的item点击

@Override
public void onClick(View v) {
    setAllFalse();
    transaction = fm.beginTransaction();
    hideAllFragment();// 先创建FragmentTransaction对象,在隐藏
    switch (v.getId()) {
    case R.id.home_layout:
        tv_home.setSelected(true);
        if (homeFrag == null) {
            homeFrag = new HomeFragment();
            transaction.add(R.id.frame_home, homeFrag, "HomeFragment");
        }
        transaction.show(homeFrag);
        break;
    case R.id.setting_layout:
        tv_setting.setSelected(true);
        if (setFrag == null) {
            setFrag = new SettingFragment();
            transaction.add(R.id.frame_home, setFrag, "SettingFragment");
        }
        transaction.show(setFrag);
        break;
        }
    drawerLayout.closeDrawers();
    transaction.commit();
}

HomeFrag:listView显示数据

先用listview显示数据,在添加pullTofresh+ imageloader,然后添加轮播图

注意:更新ui需要再主线程,所以CommonUtil.runOnUIThread(…)

HomeFrag

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    contentPager = new ContentPager(getActivity()) {

        @Override
        public Object requestData() {
            return getData();
        }

        @Override
        public View createSuccessView() {
            return getSuccessView();
        }
    };
    return contentPager;
}

protected View getSuccessView() {
    view = View.inflate(getActivity(), R.layout.frag_home, null);
    listView = (ListView) view.findViewById(R.id.listView);
    adapter = new HomeFragAdapter(appsList);
    listView.setAdapter(adapter);
    return view;
}

protected Object getData() {
    String json = HttpHelper.get(NetUrl.GAME +appsList.size());
    List<AppInfoBean> list = (List<AppInfoBean>) GsonUtil.jsonToList(json, new TypeToken<List<AppInfoBean>>() {}.getType());
    addAndRefreshData(list);
    return list;
}

private void addAndRefreshData(List<AppInfoBean> list) {
    appsList.addAll(list);

    CommonUtil.runOnUIThread(new Runnable() {

        @Override
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });
}

HomeFragAdapter:

格式化app的大小:包:String android.text.format: 方法: Formatter.formatFileSize(Context context, long number)

public class HomeFragAdapter extends MyBaseAdapter<AppInfoBean> {

    public HomeFragAdapter(List<AppInfoBean> list) {
        super(list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(parent.getContext(), R.layout.item_home_frag, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        AppInfoBean info = list.get(position);

        ImageLoader.getInstance().displayImage(NetUrl.IMAGE_PREFIX + info.getIconUrl(), holder.iv, ImageLoaderOptions.options);
        holder.tv_name.setText(info.getName());
        holder.tv_size.setText("" + Formatter.formatFileSize(MyApplication.getContext(), info.getSize()));
        holder.tv_desc.setText(info.getDes());
        holder.ratingBar.setRating(info.getStars());

        return convertView;
    }

    public class ViewHolder {

        public ImageView iv;
        public RatingBar ratingBar;
        public TextView tv_name;
        public TextView tv_size;
        public TextView tv_desc;

        public ViewHolder(View itemView) {
            super();
            iv = (ImageView) itemView.findViewById(R.id.iv_item_frag_home);
            ratingBar = (RatingBar) itemView.findViewById(R.id.ratingBar);
            tv_name = (TextView) itemView.findViewById(R.id.tv_name_frag_home);
            tv_size = (TextView) itemView.findViewById(R.id.tv_app_size_frag_home);
            tv_desc = (TextView) itemView.findViewById(R.id.tv_app_desc_frag_home);
        }
    }
}

添加刷新 pulltorefresh

参考:第三方开源库:Android-PullToRefresh-master简单使用

protected View getSuccessView() {
    view = View.inflate(getActivity(), R.layout.frag_home, null);
    ptr = (PullToRefreshListView) view.findViewById(R.id.pull_refresh_list);
    ptr.setMode(Mode.BOTH);
    ptr.setOnRefreshListener(new OnRefreshListener<ListView>() {

        @Override
        public void onRefresh(PullToRefreshBase<ListView> refreshView) {
            if (refreshView.getCurrentMode() == Mode.PULL_FROM_START) {// 下拉刷新
                handler.sendEmptyMessageDelayed(WHAT1, 1500);
            } else {// 上拉加载更多
                // handler.sendEmptyMessageDelayed(WHAT2, 1500);//模拟上拉加载更多
                contentPager.loadDataAndRefresh();
            }
        }

    });
    listView = ptr.getRefreshableView();
    adapter = new HomeFragAdapter(appsList);
    listView.setAdapter(adapter);
    return view;
}

imageloader

第三方开源库:imageLoader的使用

先要在application中初始化,在设置DisplayImageOptions,然后根据url显示图片

ImageLoader.getInstance().displayImage(NetUrl.IMAGE_PREFIX + info.getIconUrl(), holder.iv, ImageLoaderOptions.options);

轮播图

private void initBanner() {
    findHeadViews();
    initPictDescList();
    initDots();

    initViewPager();
}

private void initViewPager() {
    BannerPagerAdapter adapter = new BannerPagerAdapter(pictUrlList);
    viewPager.setAdapter(adapter);
    listView.addHeaderView(headView);
    tv_desc.setText("第一张图");
    tv_ratio.setText(1 + "/" + pictUrlList.size());
    viewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            tv_desc.setText(pictDescList.get(position));
            tv_ratio.setText(1 + position + "/" + pictUrlList.size());
            for (int i = 0; i < dotsList.size(); i++) {
                if (i == position) {
                    dotsList.get(i).setBackgroundResource(R.drawable.dot_focus);
                } else {
                    dotsList.get(i).setBackgroundResource(R.drawable.dot_normal);
                }
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {}

        @Override
        public void onPageScrollStateChanged(int arg0) {}
    });
}

private void findHeadViews() {
    headView = View.inflate(MyApplication.getContext(), R.layout.layout_banner, null);
    viewPager = (ViewPager) headView.findViewById(R.id.viewpager_banner);
    tv_desc = (TextView) headView.findViewById(R.id.tv_desc_banner);
    tv_ratio = (TextView) headView.findViewById(R.id.tv_ratio_banner);
    ll_dots = (LinearLayout) headView.findViewById(R.id.ll_dots);
}

private void initDots() {
    ll_dots.removeAllViews();
    dotsList.clear();

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
    for (int i = 0; i < pictUrlList.size(); i++) {
        TextView tv = new TextView(getActivity());
        if (i == 0) {
            tv.setBackgroundResource(R.drawable.dot_focus);
        } else {
            tv.setBackgroundResource(R.drawable.dot_normal);
        }
        params.setMargins(10, 0, 0, 0);
        ll_dots.addView(tv, params);
        dotsList.add(tv);
    }
}

private void initPictDescList() {
    for (int i = 0; i < pictUrlList.size(); i++) {
        pictDescList.add("第" + (i + 1) + "张图");
    }
}

RatingBar

<RatingBar
    android:id="@+id/ratingBar"
    style="@android:style/Widget.RatingBar"
    android:layout_width="wrap_content"
    android:layout_height="14dp"
    android:layout_marginBottom="2dp"
    android:layout_marginTop="2dp"
    android:isIndicator="true"
    android:progressDrawable="@drawable/ratingbar_drawable" />

ratingbar_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+android:id/background" android:drawable="@drawable/rating_small_empty" />
    <item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/rating_small_half" />
    <item android:id="@+android:id/progress" android:drawable="@drawable/rating_small_full" />
</layer-list>

源码

https://git.oschina.net/googlepalycqc/GooglePlayCQCDay02

时间: 2024-08-02 15:09:37

360手机助手(二):侧拉栏drawerLayout+Tab+Viewpager+ListView+Pulltorefresh+imageloder的相关文章

实现360手机助手TabHost的波纹效果

现在新版360手机助手的界面都做得挺漂亮的,在切换底部导航时的波纹效果也很好看,刚好最近看了个开源项目才了解到原来Drawable做动画效果也怎么好用,所以就仿照360实现了下带波纹的TabHost.源代码地址:https://github.com/Rukey7/XFragmentTabHost 先来看一下实现后的效果: 说明一下实现要点: 1. 因为我们项目之前用的是FragmentTabHost,所以我直接继承FragmentTabHost来实现动画效果更方便: 2. 波纹动画的实现其实是自

[软件测试] 用过360手机助手,豌豆荚的,可以考虑永远这个...

引导语 : 好久没有吃水果了,想买点桔子解解馋."老板,桔子甜不甜?""甜!""我尝尝,可以吧?""谢绝品尝!""那我怎么知道甜不甜?""我吃给你看!你看我表情就可以了!" 今天小编给大家带来一款软件,是小编在无意间在360手机助手下载到的,大家可以在360,豌豆荚搜索一下"亿动手机助手"看看...     大家复制这条链接下载一下看看,跟我们一起来吐槽这个软件 ht

Android静默安装实现方案,仿360手机助手秒装和智能安装功能

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好.虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,用户来评估一下这些权限然后决定是否要安装该程序,但如果使用了静默安装的方式,也就没

360手机助手内部资料曝光,63张PPT纯干货

360手机助手内部资料曝光,63张PPT纯干货 日前,国内最大的安卓应用商店360手机助手发布了<2016年手机软件行业趋势绿皮书>,这份绿皮书对2015年以来移动互联网的趋势做了总结,展望了2016年的发展方向.从这份绿皮书所反映的现状来看,当前,国内移动互联网或来到了一个十字路口. 这份报告的每一页PPT都是干货,对于移动互联网从业者.政府决策层来说绝对不能错过. 1.2015年移动端用户增速放缓并渐趋饱和,市场竞争迈入零和时代 随着中国人口结构的变化,人口红利出现下降,影响至移动智能终端

Slidingmenu 仿 网易 360手机助手 框架 直接拿来用

天气太热了,上班也没什么精神头.索性  整理下项目中用到的 框架 抽出来,方便下次直接用吧. 大家应该都知道 slidingmenu的.就是github 上的一个开源框架  可以实现 左右滑动, 时下 好多app都用到了,比如 网易新闻 ,360手机助手, 糗事百科,ireader. 应该算是很火的一个框架了. no exception  我们公司的项目也用到了. 废话有点多.下面直奔主题吧 首先介绍下 框架的结构 先上几张图,不会做gif ..    再看下包结构 主要实现侧滑的功能代码 在

android 浮动窗口学习笔记及个人理解(仿360手机助手)

非常感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序运行界面如下图: 1.程序入口界面 2.小浮动窗口 3.大浮动窗口 由上图可看出,可以看出我们基本需要: 1.一个主Activity 2.小浮动窗口view界面 3.大浮动窗口view界面 对于浮动窗口的管理我们还需要 4.一个Service(在后台监控管理浮动窗口的状态) 5.窗口管理类(创建/消除浮动窗口) 代码: package com.ww.

360手机助手关于签名校验的分析

360手机助手中软件更新 0x01:分析过程 使用wireshark抓包分析更新时请求的是一个配置文件,请求url:update.api.sj.360.cn/mintf/getAppsByPackNames  后面是参数,请求方式为POST,内容如下: 可以看到其中包含了几个关键的参数down_url,apk_md5,signature_md5,size,其中比较关键的一个校验是signature_md5,其他都可以轻松替换,所以我们的重点就是对signature_md5,校验的破解,去分析他对

360手机助手使用问题

作为一个测试人员,要懂得将错误重现 问题描述一: 目标:手机通过USB线连接电脑 问题: 手机明明已经连接了电脑: 却提示: 要么就一直是无线连接(大哥,我要真机测试玩安卓啊,你给我无线连接有P用啊) 先断开无线连接,然后点击连接: 我还以为是USB线或者电脑的USB插口坏掉了,幸好不是 解决办法: 在手机[设置]->[开发人员选项]->[连接USB后启用调试模式]->勾选,即可 问题解决 问题描述二: 目标:更新手机上软件 问题: 手机连接到电脑后,发现只提示部分软件更新,接着发现内存

Android高仿UC浏览器和360手机卫士消息常驻栏(通知栏)

之前网上看了下自己定义消息栏,通知栏,了解到了Notification这个控件.发现UC浏览器等都是这样的类型,今天写个demo实现下.如图: 当中每一个button都有不同的功能.代码例如以下: package com.example.textwsjdemo; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.a