安卓市场--首页2

在《首页1》这篇文章中,我们讲述了在首页中加入一个自定义的广告栏,下面我们将继续完成首页内容的添加。

在我们在想法中就是在广告栏下面是一个ListView用于显示比较新的或者是下载量比较高的app。下面我们就来做这一项工作。

1:首先,我们需要在activity_home.xml文件中添加如一个ListView作为显示列表。该ListView的布局就是在广告栏的下面即可。

我们来看一下代码:


    <RelativeLayout
            android:id="@+id/rl_apps"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/rl_advers">
            <ListView
                android:id="@+id/lv_apps"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="2dp"
                android:layout_marginTop="4dp"
                android:background="@drawable/shape_rectangle"
                android:cacheColorHint="#00000000"
                android:divider="@drawable/line_bg_blue"
                android:dividerHeight="1.0dp"
                android:fadingEdge="vertical"
                android:listSelector="@drawable/listview_item_bg"
                android:scrollbarStyle="outsideOverlay" >
            </ListView>
        </RelativeLayout>

其中就几个属性,我来说一下ListView中的一些属性问题。

  • 1:cacheColorHint:祛除ListView的拖动背景色。当我们使用自定义的ListView的时候,特别容易出现这个问题。当我们在拖动ListView滑动的时候,背景就会出现黑色。
  • 2:divider:指定ListView中的item之间的分割线
  • 3:dividerHeight:设置分割线的宽度
  • 4:fadingEdge:设置后上面和下面有黑色的阴影
  • 5:listSelector:设置ListView中的item被选中之后的图像
  • 6:scrollbarStyle:设置滚动条和分割线的覆盖问题

2:在这里我们重点看的就是shape_rectangle样式,这个是我们定义的一个圆角的drawable,其实xml内部节点为shape。这个其实在上面的博客中已经说到了,在这里我在上一次关于这个的代码:

shape_rectangle.xml


    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/round_rectangle_bg_pressed" /> <!-- pressed -->
    <item android:state_focused="true" android:drawable="@drawable/round_rectangle_bg_pressed" /> <!-- focused -->
    <item android:state_selected="true" android:drawable="@drawable/round_rectangle_bg_pressed" /> <!-- selected -->
    <item android:drawable="@drawable/round_rectangle_bg" /> <!-- default bg_list_item_normal -->
    </selector>

round_rectangle_bg_pressed.xml


    <?xml version="1.0" encoding="utf-8"?>
    <shape
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle"
      ><!-- android:shape="" 表示是圆角矩形还是椭圆等等 -->
        <solid android:color="#ffffff"/> <!-- 背景颜色 -->  

        <!-- padding 表示内部空间距离背景图片内部边距 的距离 -->
         <padding android:left="10dp" android:top="5dp"
                android:right="10dp" android:bottom="5dp" />  

         <stroke android:width="1dp" android:color="#cecece"/> <!-- 图片边框属性 -->
          <corners android:radius="10dp" /> <!-- 圆角的程度 -->
        <gradient android:startColor="#ffffff" android:centerColor="#ffffff"
            android:endColor="#ffffff" android:type="linear" android:angle="90"
            android:centerX="0.5" android:centerY="0.5" />
    </shape>

round_rectangle_bg.xml


    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >

        <!-- android:shape="" 表示是圆角矩形还是椭圆等等 -->
        <solid android:color="#ffffff" />
        <!-- 背景颜色 -->

        <!-- padding 表示内部空间距离背景图片内部边距 的距离 -->
        <padding
            android:bottom="5dp"
            android:left="10dp"
            android:right="10dp"
            android:top="5dp" />

        <stroke
            android:width="1dp"
            android:color="#cecece" />
        <!-- 图片边框属性 -->
        <corners android:radius="10dp" />
        <!-- 圆角的程度 -->
        <gradient
            android:angle="90"
            android:centerColor="#ffffff"
            android:centerX="0.5"
            android:centerY="0.5"
            android:endColor="#ffffff"
            android:startColor="#ffffff"
            android:type="linear" />

    </shape>

好了,到了这一步,我们的ListView也定义好了,下面我们该定义我们的ListView Item和相应的Adapter了。

3:定义ListView Item

在我们的res/layout文件夹下面创建lv_app_item.xml,其中根布局选择RelativeLayout。

我们看一下我们的代码是如何定义的。


    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <RelativeLayout
            android:id="@+id/rl_app_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:layout_marginBottom="2dp">

            <!--
            <com.android.volley.toolbox.NetworkImageView
                android:id="@+id/app_image"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_marginLeft="10dip"
                android:background="@drawable/noimage" />

            -->

            <ImageView
                android:id="@+id/app_image"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_marginLeft="5dip"
                android:background="@drawable/icon4" />

            <RelativeLayout
                android:id="@+id/rl_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_toRightOf="@id/app_image" >

                <TextView
                    android:id="@+id/tv_app_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:singleLine="true"
                    android:text="@string/tv_name"
                    android:textColor="@color/black"
                    android:textSize="20sp" />

                <TextView
                    android:id="@+id/tv_down_count"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_app_name"
                    android:layout_marginTop="2dp"
                    android:text="6万次下载"
                    android:textSize="12sp" />

                <TextView
                    android:id="@+id/tv_app_size"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_app_name"
                    android:layout_marginLeft="8dp"
                    android:layout_marginTop="2dp"
                    android:layout_toRightOf="@id/tv_down_count"
                    android:text="3.62M"
                    android:textSize="12sp" />

                <TextView
                    android:id="@+id/tv_brief"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_app_size"
                    android:layout_marginTop="2dp"
                    android:ellipsize="end"
                    android:singleLine="true"
                    android:text="手游福利平台,更有海量精品游戏奥"
                    android:textSize="10sp" >
                </TextView>
            </RelativeLayout>

            <ImageView
                android:id="@+id/iv_download"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="5dip"
                android:background="@drawable/btn_icon_download_ring" />
        </RelativeLayout>

    </RelativeLayout>

我们看一下item的截图:

4:创建JavaBean类,保存app信息

为了能够在Adapter中显示app的信息,我们需要创建一个能够保存每一个app信息的类,我们称之为JavaBean。

在包com.sdu.beans下创建一个名为”AppBriefBean.java”文件,其中包含着app的一些信息以及对应的getters和setters方法。

我们来看一下:


    package com.sdu.beans;

    public class AppBriefBean {

        private String appID; /* app的唯一标识 */
        private String appIconAdd; /* app的图标的地址 */
        private String appName; /* app的名称 */
        private String appDownCount; /* app的下载次数 */
        private String appSize; /* app的大小 */
        private String briefInfo; /* app的简介 */
        private String appAddress; /* app的下载地址 */

        public AppBriefBean(String appID, String appIconAdd, String appName,
                String appDownCount, String appSize, String briefInfo,
                String appAddress) {
            super();
            this.appID = appID;
            this.appIconAdd = appIconAdd;
            this.appName = appName;
            this.appDownCount = appDownCount;
            this.appSize = appSize;
            this.briefInfo = briefInfo;
            this.appAddress = appAddress;
        }

        public String getAppID() {
            return appID;
        }

        public void setAppID(String appID) {
            this.appID = appID;
        }

        public String getAppIconAdd() {
            return appIconAdd;
        }

        public void setAppIconAdd(String appIconAdd) {
            this.appIconAdd = appIconAdd;
        }

        public String getAppName() {
            return appName;
        }

        public void setAppName(String appName) {
            this.appName = appName;
        }

        public String getAppDownCount() {
            return appDownCount;
        }

        public void setAppDownCount(String appDownCount) {
            this.appDownCount = appDownCount;
        }

        public String getAppSize() {
            return appSize;
        }

        public void setAppSize(String appSize) {
            this.appSize = appSize;
        }

        public String getBriefInfo() {
            return briefInfo;
        }

        public void setBriefInfo(String briefInfo) {
            this.briefInfo = briefInfo;
        }

        public String getAppAddress() {
            return appAddress;
        }

        public void setAppAddress(String appAddress) {
            this.appAddress = appAddress;
        }

    }

5:编写Adapter

在包com.sdu.adapters中创建一个明为”AppListAdapter.java”文件,该类继承自BaseAdapter。

按照创建Adapter的流程,首先我们需要有一个容器来保存每一个app的信息,我们这里使用ArrayList.


    /* 储存app信息的数据 */
    private ArrayList<AppBriefBean> appList;

然后再根据LayoutInfalter和Context获取对应的组件进行赋值即可。我们看一下AppListAdapter.java的完整程序。


    package com.sdu.adapters;

    import java.util.ArrayList;

    import com.sdu.androidmarket.R;
    import com.sdu.beans.AppBriefBean;

    import android.content.Context;
    import android.net.Uri;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

    public class AppListAdapter extends BaseAdapter{

        /* 储存app信息的数据 */
        private ArrayList<AppBriefBean> appList;
        private LayoutInflater inflate;

        public AppListAdapter(ArrayList<AppBriefBean> appList,Context context){
            this.appList = appList;
            this.inflate = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return appList == null?0:appList.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return appList.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            Holder holder;

            if(convertView == null){
                holder = new Holder();

                convertView = inflate.inflate(R.layout.lv_app_item, null);
                holder.app_image = (ImageView)convertView.findViewById(R.id.app_image);
                holder.tv_app_name = (TextView)convertView.findViewById(R.id.tv_app_name);
                holder.tv_down_count = (TextView)convertView.findViewById(R.id.tv_down_count);
                holder.tv_app_size = (TextView)convertView.findViewById(R.id.tv_app_size);
                holder.tv_brief = (TextView)convertView.findViewById(R.id.tv_brief);

                convertView.setTag(holder);
            }else{
                holder = (Holder)convertView.getTag();
            }

            if(appList.get(position).getAppIconAdd() == null || appList.get(position).getAppIconAdd().equals("")){

            }else{
                holder.app_image.setImageURI(Uri.parse(appList.get(position).getAppIconAdd()));
            }

            if(appList.get(position).getAppName() != null)
                holder.tv_app_name.setText(appList.get(position).getAppName());

            if(appList.get(position).getAppDownCount() != null)
                holder.tv_down_count.setText(appList.get(position).getAppDownCount()+"次下载");

            if(appList.get(position).getAppSize() != null)
                holder.tv_app_size.setText(appList.get(position).getAppSize());

            if(appList.get(position).getBriefInfo() != null)
                holder.tv_brief.setText(appList.get(position).getBriefInfo());

            return convertView;
        }

        class Holder{
            ImageView app_image;
            TextView tv_app_name;
            TextView tv_down_count;
            TextView tv_app_size;
            TextView tv_brief;
        }

    }

6:初始化ListView(使用测试数据)

好了,Adapter也做好了,现在我们测试一下呗。在HomeActivity中使用测试数据进行对ListView的初始化,我们先来看一下实现代码:


    package com.sdu.activities;

    import java.util.ArrayList;

    import net.tsz.afinal.FinalBitmap;

    import com.sdu.adapters.AppListAdapter;
    import com.sdu.androidmarket.R;
    import com.sdu.beans.AppBriefBean;
    import com.sdu.ui.AdGallery;
    import com.sdu.utils.AppLog;

    import android.content.Intent;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.view.Window;

    public class HomeActivity extends BaseActivity {

        private TextView tv_search;
        private TextView tv_contact;
        private ImageView iv_dia;

        private AdGallery app_advers;
        private LinearLayout ovalLayout; // 圆点容器

        /** 图片id的数组,本地测试用 */
        private int[] imageId = new int[] { R.drawable.test, R.drawable.test,
                R.drawable.test, R.drawable.test };

        /** 图片网络路径数组 */
        private String[] mris = {
                "http://img.my.csdn.net/uploads/201312/14/1386989803_3335.PNG",
                "http://img.my.csdn.net/uploads/201312/14/1386989613_6900.jpg",
                "http://img.my.csdn.net/uploads/201312/14/1386989802_7236.PNG" };

        /* 显示app的ListView */
        private ListView lv_apps;

        /* app ListView的适配器 */
        private AppListAdapter appsAdapter;

        /* 存放数据的array */
        private ArrayList<AppBriefBean> appsList = new ArrayList<AppBriefBean>();

        @Override
        public void initWidget() {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_home);

            FinalBitmap.create(this); // android 框架 这里用于加载网络图片 

            tv_search = (TextView)findViewById(R.id.tv_search);
            tv_contact = (TextView)findViewById(R.id.tv_contact);
            iv_dia = (ImageView)findViewById(R.id.iv_dia);

            lv_apps = (ListView)findViewById(R.id.lv_apps);

            /**测试一下 */
            appsList.add(new AppBriefBean("1", null, "360游戏大厅", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "小时代", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "360免费wifi", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "全民2048", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "58同城", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "开心消消乐", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "看点", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));
            appsList.add(new AppBriefBean("1", null, "神庙逃亡2", "100", "2.34M", "手游福利平台,更有海量精品游戏奥", null));

            appsAdapter = new AppListAdapter(appsList, getApplicationContext());
            lv_apps.setAdapter(appsAdapter);

            tv_search.setOnClickListener(this);
            tv_contact.setOnClickListener(this);
            iv_dia.setOnClickListener(this);

            app_advers = (AdGallery)findViewById(R.id.app_advers);
            ovalLayout = (LinearLayout) findViewById(R.id.ovalLayout);// 获取圆点容器

            // 第二和第三参数 2选1 ,参数2为 图片网络路径数组 ,参数3为图片id的数组,本地测试用 ,2个参数都有优先采用 参数2
            app_advers.start(this, mris, imageId, 3000, ovalLayout,
                            R.drawable.dot_focused, R.drawable.dot_normal);

            app_advers.setAdversOnItemClickListener(new AdGallery.AdversOnItemClickListener() {
                public void onItemClick(int curIndex) {
                    AppLog.error("点击的图片下标为:" + curIndex);
                    // System.out.println(curIndex);
                }
            });

            lv_apps.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub

                }
            });
        }

        @Override
        public void widgetClick(View v) {
            Intent intent = null; 

            switch(v.getId()){
            case R.id.tv_search:
                intent = new Intent(HomeActivity.this,SearchActivity.class);
                startActivity(intent);
                break;
            case R.id.tv_contact:
                intent = new Intent(HomeActivity.this,MeActivity.class);
                startActivity(intent);
                break;
            case R.id.iv_dia:
                intent = new Intent(HomeActivity.this,DiacodeActivity.class);
                startActivity(intent);
                break;
            }
        }
    }

好了,做到这里,我们的首页就算是完成了,我们来看一下我们的效果截图吧!

版权声明:您好,转载请留下本人博客的地址,谢谢

时间: 2024-12-07 08:06:24

安卓市场--首页2的相关文章

安卓市场-框架搭建

在我们学习完android的基础知识之后,肯定很想通过自己所学习的基础知识来构建一个自己的安卓项目,但是又不知道从何下手,我们这个专题就是为了学习完安卓的基础知识之后,来练手用的. 我们这款项目是通过编写一个我们经常用到的安卓市场来对知识的一个综合应用,该应用具体有以下功能: 1:有这么几个tab,首页,分类,推荐和主题 2:首页分为上中下三个部分,分别为搜索,推荐栏和app列表 3:分类使用格子效果展示类别,点击进入app列表展示 4:推荐是使用别人实现的一个推荐效果 5:主题分别显示图片和文

上传应用并生成下载链接需要多少钱;安卓市场上传应用需要什么

联系QQ:2205357007 上传应用并生成下载链接需要多少钱:安卓市场上传应用需要什么 上传应用程序到安卓分发市场时,经常需要填写一些有关apk安装包的信息.而作为非技术开发人员的我们同样需要识记一下这些信息,在下载安装包.安装应用到手机时,都是非常有用的. 目前,安卓应用的分发市场很多,但不需要所有的市场都要上传一遍,尤其是覆盖用户数量小的分发市场.常见的分发市场有: 百度系:百度手机助手.91手机助手.安卓市场 360手机助手.淘宝手机助手.小米手机助手.腾讯应用宝.豌豆荚.机锋市场等这

Android Market 分析【安卓市场】

安卓市场: 通过对表的分析,“下载任务”的数据来源于数据库[app_download],“已安装”的数据来源于数据库[software_installed]. 数据分析:----- bash-3.2# pwd/data/data/com.hiapk.marketpho bash-3.2# ls -a -ldrwxr-x--x 1 app_47 app_47 2048 Feb 4 12:38 .drwxrwx--x 1 system system 2048 Mar 4 23:29 ..drwxrw

自定义控件六:高仿安卓市场桌面悬浮菜单

最近在学习自定义控件,无意中看到了手机上"安卓市场"桌面悬浮菜单,感觉很高大上,所以自己就简单照着样子做了一遍: 首先看原图: 涉及到的知识: ①首先这个控件是自定义的ViewGroup,需要知道自定义控件中的onMeasure.onLayout的用法. onMeasure:主要是根据上一级推荐的宽高计算出当前控件的宽高,然后测量当前控件中的每一个子View. onLayout:为当前控件中的每一个子View进行布局. ②初中所学的三角函数.反三角函数. 例如: 在数学中:sina =

了解到的iPhone&amp;安卓——市场之一

如今二手手机的灰色产业链的形态衍生于「在保」的官换iPhone以及苹果提供给经销商的这个抵扣机会.经销商会说这种官换机「是全新的国行版本机器,在硬件外观上和全新机都没有差别:官换机的保修一般是300天左右,和新机一样享受全国联保的保修政策和服务」就是这种在硬件外观上和全新机都没有差别的全新国行版本机器, 它们的来源是统一的黑价回收然后蓄意制造出故障再送到苹果官方售后或授权售后进行「保修」,回收价格夸张的低,几乎全部会被拿去官换.去Apple Store九新在保的5s可以抵扣1500元购买新iPh

安卓市场--框架搭建3

在我们的上一篇博客中,最基本的框架已经搭建完成了,那我们为什么这篇文章还叫做框架搭建呢?原因就是之前我们搭建的是贯穿这个项目,要对这个项目的声明周期进行管理的框架,而后面我们需要做的是搭建一个我们需要的与内容有关的框架. 下面我们先来看一下我们这个框架最终的效果: 在这个框架中,我们需要做的有下面几个工作: 1:添加一个TabHost,tab分别是首页,分类,排行,推荐和主题 2:首页上方有一个用户按钮,搜索框和二维码扫描按钮 3:添加侧滑栏 4:点击各个按钮之后都能进入相应的界面 下面我们一个

安卓市场--框架搭建2

在上一篇中,我们回想了android的activity的生命周期以及Application的基本知识.在这一篇中,我们正式開始我们的项目之旅. 在我们进行项目开发的时候,首先须要做的就是搭建一个项目框架.因为我也没有正式的去公司工作过,只就是依照自己的理解来搭建一个小型的项目框架,我们先来完毕第一步. 在我们的不论什么一个android程序中.都须要一个对activity进行管理的类,我们如今称作AppManager,既然该类是对activity进行管理的,我们就须要记录每个activity,依

安卓市场--框架搭建5

在上一篇中,我们已经把框架搭建的差不多了,只剩下最后一个需要的功能框架,就是右滑栏.对于右滑栏的使用,我们使用在github上比较火热的SlidingMenu来创建我们需要的侧滑栏. 首先我们需要为我们的侧滑栏创建一个布局文件,在res/layout文件夹下面创建一个activity_left_layout.xml文件,并选择RelativeLayout布局. 在我们的侧滑栏中肯定放一些选项,那么我们就是用ListView进行布局,下面看一下代码: <?xml version="1.0&q

国内安卓软件市场审核 体验综合比较

发布者:应用推编辑 2014年6月25日 有 542 人阅读 分类:APP推广, 市场上架 发表评论 说到APP推广,作为一个开发者或商务推广专员,自然少不了和渠道(本文指国内安卓应用软件市场)打交道,下面应用推编辑简单介绍下国内几家知名安卓市场的开发者.应用审核情况.360手机助手 安智市场 安卓市场作为行业老大,360手机助手无论是在开发者的审核还是应用.游戏的审核力度都比较严格,比如现在个人开发者必须提交手持身份证的图像才可以提交,在绑定手机之后,可以第一时间掌握所提交应用的审核情况,审核