Android 软件管理器的开发



一、布局

分三块:

1. 

2. 

 

3. 

第一部分是一张图(ImageView) 和 几个字(TextView)

第二部分是列表(ListVIew)

第三部分是三个按钮 

具体怎么去放到合理的位置就不具体说了。自己慢慢试,这样才能熟练。(提示: 可以用相对布局àRelativeLayout 来整体布局这三块)。 

可以参考项目中的show.xml:已经写好了注释

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.                 xmlns:umadsdk="http://schemas.android.com/apk/res/stane.appExplorer"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="#313849">  
  7.   
  8. <!--  1. 单位有dip、px,具体区别自己百度。       
  9.       2. 字体的单位用 sp  
  10.       3. gravity 是自己相对与父控件的位置;Layout_gravity是自己的子控件相对与自己的位置  
  11.       4. orientation:   Layout中的控件是水平 排列还是竖直  
  12.       其它的可以参看文档,文档中写的很详细,也很简单-->  
  13.       
  14.       
  15.     <LinearLayout    
  16.         android:layout_height="30dip"    
  17.         android:layout_width="fill_parent"  
  18.         android:orientation="horizontal"    
  19.         android:gravity="center_vertical"  
  20.         android:paddingLeft="5dip"  
  21.         android:background="@drawable/top_bg">  
  22.           
  23.         <ImageView  
  24.                 android:layout_width="18dip"   
  25.                 android:layout_height="18dip"  
  26.                 android:src="@drawable/manage"/>  
  27.         <TextView  
  28.                 android:layout_width="wrap_content"   
  29.                 android:layout_height="wrap_content"  
  30.                 android:textColor="#000"  
  31.                 android:textSize="14sp"  
  32.                 android:text="@string/app_type"/>  
  33.     </LinearLayout>  
  34.     
  35.     
  36.   <LinearLayout        
  37.         android:layout_width="fill_parent"  
  38.         android:layout_height="fill_parent"  
  39.         android:layout_marginTop="28dip"  
  40.         android:layout_marginBottom="100dip"  
  41.         android:layout_marginLeft="5dip"  
  42.         android:layout_marginRight="5dip">  
  43.         <ListView  
  44.         android:id="@+id/lv_apps"  
  45.         android:layout_width="fill_parent"  
  46.         android:layout_height="fill_parent"  
  47.         android:listSelector="@drawable/choose_listview"  
  48.         android:visibility="gone"/>  
  49.     </LinearLayout>  
  50.       
  51.       
  52.       
  53.       
  54.      <RelativeLayout  
  55.         android:layout_width="fill_parent"  
  56.         android:layout_height="50dip"  
  57.         android:layout_alignParentBottom="true"  
  58.         android:background="@drawable/bottom_bg">  
  59.         <ImageButton  
  60.             android:id="@+id/ib_change_view"  
  61.             android:layout_alignParentLeft="true"  
  62.             android:layout_width="70dip"  
  63.             android:layout_height="45dip"  
  64.             android:layout_marginRight="5dip"  
  65.             android:layout_marginTop="3dip"  
  66.             android:src="@drawable/list"/>  
  67.         <ImageButton  
  68.             android:id="@+id/ib_change_category"  
  69.             android:layout_alignParentRight="true"  
  70.             android:layout_width="70dip"  
  71.             android:layout_height="45dip"  
  72.             android:layout_marginRight="5dip"  
  73.             android:layout_marginTop="3dip"  
  74.             android:src="@drawable/all"/>  
  75.         <Button  
  76.             android:id="@+id/ib_shop"  
  77.             android:layout_centerInParent="true"  
  78.             android:layout_width="70dip"  
  79.             android:layout_height="50dip"  
  80.             android:text="淘软件"  
  81.             android:background="@drawable/button_install_selector"/>  
  82.      </RelativeLayout>   
  83.       
  84.       
  85. </RelativeLayout>  
二、 ListView

      关于ListView 要用 适配器来填充内容。 适配器有好几种: SimpleAdapter、ArrayAdapter等。 不过项目中经常要自己继承基类BaseAdapter 。

  1. package com.stone.app;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.BaseAdapter;  
  8. import android.widget.ImageView;  
  9. import android.widget.TextView;  
  10.   
  11. /** 
  12.  * 有四个方法要重写 
  13.  */  
  14. public class ListViewAdapter extends BaseAdapter {  
  15.     LayoutInflater inflater;  
  16.     Context context;  
  17.   
  18.     public ListViewAdapter(Context context) {  
  19.         // TODO Auto-generated constructor stub   
  20.         this.context = context;  
  21.         inflater = LayoutInflater.from(context);  
  22.     }  
  23.   
  24.     /** 
  25.      * getCount()中的返回值决定了ListView有的列数 
  26.      */  
  27.     @Override  
  28.     public int getCount() {  
  29.         // TODO Auto-generated method stub   
  30.         return 10;  
  31.     }  
  32.   
  33.     /** 
  34.      * 可以返回null, 也可以返回其它的数据。 
  35.      */  
  36.     @Override  
  37.     public Object getItem(int position) {  
  38.         // TODO Auto-generated method stub   
  39.         return null;  
  40.     }  
  41.   
  42.     @Override  
  43.     public long getItemId(int position) {  
  44.         // TODO Auto-generated method stub   
  45.         return 0;  
  46.     }  
  47.   
  48.     /** 
  49.      * 这个是最重要的方法。 返回值就是列表中第position列要显示的内容 
  50.      * position: 当前的View位于第几列 
  51.      * convertView: 当前的的列上 要显示的内容 
  52.      */  
  53.     @Override  
  54.     public View getView(int position, View convertView, ViewGroup parent) {  
  55.         // TODO Auto-generated method stub   
  56.         View view = inflater.inflate(R.layout.lv_item, null);// lv_item.xml    就是每一列要显示的内容   
  57.           
  58.         ImageView imageView = (ImageView) view.findViewById(R.id.lv_icon);  
  59.         TextView tv_appname = (TextView) view.findViewById(R.id.lv_item_appname);  
  60.         TextView tv_package = (TextView) view.findViewById(R.id.lv_item_packagename);  
  61.           
  62.         imageView.setBackgroundResource(R.drawable.icon);  
  63.         tv_appname.setText("应用的名称");  
  64.         tv_package.setText(context.getResources().getString(R.string.packageName));  
  65.           
  66.         return view;  
  67.     }  
  68.   
  69. }  

再来看上面的代码, 在getView中,每列都会new 一个view,然后去填充相应的数据, 这就需要注意了,因为getView在每项显示的时候就会调用(包括滚动重新显示)就会调用。 这样就会浪费手机的资源。其实每一项的view只需要填充一次。下面的getView优化后的代码

  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     // TODO Auto-generated method stub   
  4.       
  5.   
  6.       
  7.       
  8.     Holder view = null;  
  9.     if (convertView == null) {  
  10.         view = new Holder();  
  11.         convertView = inflater.inflate(R.layout.lv_item, null);  
  12.         view.imageView = (ImageView) convertView  
  13.                 .findViewById(R.id.lv_icon);  
  14.         view.tv_appname = (TextView) convertView  
  15.                 .findViewById(R.id.lv_item_appname);  
  16.         view.tv_package = (TextView) convertView  
  17.                 .findViewById(R.id.lv_item_packagename);  
  18.         convertView.setTag(view);//通过setTag把该view保存起来。   
  19.     } else {  
  20.         view = (Holder) convertView.getTag();  //convertView不为空是,直接拿到保存的view   
  21.     }  
  22.       
  23.     view.imageView.setBackgroundResource(R.drawable.icon);  
  24.     view.tv_appname.setText("应用的名称");  
  25.     view.tv_package.setText(context.getResources().getString(R.string.packageName));  
  26.       
  27.     return convertView;  
  28. }  
Holder是一个内部类:
  1. class Holder {  
  2.     ImageView imageView;  
  3.     TextView tv_appname;  
  4.     TextView tv_package;  
  5.   
  6.     TextView textView2;  
  7.     ImageView imageView2;  
  8. }  

相关内容