標籤: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:程式主介面