在《首页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;
}
}
}
好了,做到这里,我们的首页就算是完成了,我们来看一下我们的效果截图吧!