【邊做項目邊學Android】手機安全衛士05_1:程式主介面

來源:互聯網
上載者:User

標籤:android   gridview   布局   資料   

主介面布局(知識點:GridView)mainscreen.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/background"    android:orientation="vertical" >       <GridView     android:id="@+id/gv_main"          android:layout_width="match_parent"        android:layout_height="match_parent"        android:horizontalSpacing="10dip"        android:verticalSpacing="20dip"        android:numColumns="3"        >           </GridView></LinearLayout>

android:background="@color/background"--設定背景顏色,此處採用顏色資源檔(/mobilesafe/res/values/color.xml)
color.xml:

<?xml version="1.0" encoding="utf-8"?><resources>    <color name="background">#ff404040</color>    <color name="textcolor">#ffd0d0d0</color>   </resources> 

GridView :android:numColumns="3"-----列數設定為3列
android:horizontalSpacing="10dip"-----兩列之間的邊距
android:verticalSpacing="20dip"-----兩行之間的邊距資料適配MainUIAdapter(知識點:LayoutInflater,BaseAdapter )

MainUIAdapter :

package com.liuhao.mobilesafe.adapter;import com.liuhao.mobilesafe.R;import android.content.Context;import android.content.SharedPreferences;import android.util.Log;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 MainUIAdapter extends BaseAdapter {private static final String TAG = "MainUIAdapter";private Context context;//用於接收傳遞過來的Context對象private LayoutInflater inflater;private static ImageView iv_icon;private static TextView tv_name;private SharedPreferences sp;public MainUIAdapter(Context context) {this.context = context;inflater = LayoutInflater.from(context);sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);}// 資料來源,子條目的常值內容private static String[] names = { "手機防盜", "通訊衛士", "軟體管理", "任務管理", "上網管理","手機殺毒", "系統最佳化", "進階工具", "設定中心" };// 資料來源,子條目的對應圖片private static int[] icons = { R.drawable.widget05, R.drawable.widget02,R.drawable.widget01, R.drawable.widget07, R.drawable.widget05,R.drawable.widget04, R.drawable.widget06, R.drawable.widget03,R.drawable.widget08 };/** * How many items are in the data set represented by this Adapter. * 在此適配器中所代表的資料集中的條目數 */@Overridepublic int getCount() {return names.length;}/** * Get the data item associated with the specified position in the data set. * 擷取資料集中與指定索引對應的資料項目 */@Overridepublic Object getItem(int position) {return position;}/** * Get the row id associated with the specified position in the list. * 取在列表中與指定索引對應的行id */@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//getView()方法被調用了多少次?//9次?//GridView 控制項bug// 使用靜態變數引用來減少記憶體中申請的引用的個數Log.i(TAG, "getView" + position);// 得到布局檔案對應的View對象// inflate()方法一般接收兩個參數,第一個參數就是要載入的布局id,// 第二個參數是指給該布局的外部再嵌套一層父布局,如果不需要就直接傳null。View view = inflater.inflate(R.layout.mainscreen_item, null);iv_icon = (ImageView) view.findViewById(R.id.iv_main_icon);tv_name = (TextView) view.findViewById(R.id.tv_main_name);iv_icon.setImageResource(icons[position]);tv_name.setText(names[position]);if(position == 0){// 從SharedPreferences擷取條目的常值內容String name = sp.getString("lost_name", null);if(!"".equals(name) && null != name){tv_name.setText(name);}}return view;}}

子條目的布局:

mainscreen_item.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="100dip"    android:layout_height="100dip"    android:orientation="vertical"    android:gravity="center_horizontal"    android:background="@drawable/item_background"    >       <ImageView        android:id="@+id/iv_main_icon"        android:layout_width="60dip"        android:layout_height="60dip"        android:src="@drawable/ic_launcher"        android:scaleType="fitXY"        />    <TextView        android:id="@+id/tv_main_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="18sp"        android:textColor="@color/textcolor"        android:text="程式功能"        /></LinearLayout> 

為每個條目添加背景圖(知識點:android:shape)

item_background.xml:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle"    >    <!-- 邊框 -->    <stroke        android:width="1dip"        android:color="#ff202020"        />       <!-- 指定邊角 -->    <corners        android:radius="2dip"        />       <!-- 指定固定顏色 -->    <solid        android:color="@color/background"        />       <!-- 漸層色 -->    <gradient /></shape> 

MainActivity中使用

gv_main = (GridView) this.findViewById(R.id.gv_main);adapter = new MainUIAdapter(this);gv_main.setAdapter(adapter);

效果:


GridView中的getView()方法被調用了多少次?9次(9個條目)?

每個條目會多次調用getView()方法;

原因:

GridView的item的layout中android:layout_height定義為wrap_content , 繪製item高度時系統並不知道item應該繪製多高,它會先取一條來試探以確定item繪製的具體高度,這樣就導致多調用了一次getView方法。在滑動、長按等GridView需要重繪的情況下,getView的調用次數可能會不止多一次。

解決方案1:

由於多次調用getView()方法,每次都會重建一個iv_icon ,tv_name控制項對象,從而產生多個對象執行個體,造成空間浪費。因此,一個簡單的最佳化方法就是,將二者設定為類靜態變數:

private static ImageView iv_icon;
private static TextView tv_name;

使用靜態變數引用來減少記憶體中申請的引用的個數,這樣可以在一定程度上提高效率。

後續還會有其他最佳化方法。

【邊做項目邊學Android】手機安全衛士05_1:程式主介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.