閱讀45 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android手機衛士06-girdview優化


ListView和GridView是我們經常會使用的控件,所以它們的效率是一個非常重要的事情,如果我們滑動的時候,會出現停頓的現在,那麼,這次是一個非常不好的體驗。所以我們有必要要對這些控件進行優化。

其實,我們用這些控件的時候,都是通過adapter來進行給這些控件添加item的,所以我們的優化也就是在adapter裏麵進行的。其實這個優化方法也很簡單,就是在進行view的繪製的時候,我們判斷一下,是不是已經繪製過啦,如果繪製過了,那麼就使用原來的,如果沒有繪製過,那麼就重新繪製。直接上代碼,大家可以與我們之前寫的那個adapter比較一下有什麼不同

com.xiaobin.security.adapter.MainUIAdapter

  1. package com.xiaobin.security.adapter;

  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  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. import com.xiaobin.security.R;

  11. public class MainUIAdapter extends BaseAdapter
  12. {
  13.         private static final String[] NAMES = new String[] {"手機防盜", "通訊衛士", "軟件管理", "流量管理", "任務管理", "手機殺毒",
  14.                         "係統優化", "高級工具", "設置中心"};
  15.        
  16.         private static final int[] ICONS = new int[] {R.drawable.widget01, R.drawable.widget02, R.drawable.widget03,
  17.                         R.drawable.widget04, R.drawable.widget05, R.drawable.widget06, R.drawable.widget07,
  18.                         R.drawable.widget08, R.drawable.widget09};
  19.        
  20.         private Context context;
  21.         private LayoutInflater inflater;
  22.         private SharedPreferences sp;
  23.        
  24.         public MainUIAdapter(Context context)
  25.         {
  26.                 this.context = context;
  27.                 inflater = LayoutInflater.from(this.context);
  28.                 sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
  29.         }

  30.         @Override
  31.         public int getCount()
  32.         {
  33.                 return NAMES.length;
  34.         }

  35.         @Override
  36.         public Object getItem(int position)
  37.         {
  38.                 return position;
  39.         }

  40.         @Override
  41.         public long getItemId(int position)
  42.         {
  43.                 return position;
  44.         }

  45.         @Override
  46.         public View getView(int position, View convertView, ViewGroup parent)
  47.         {
  48.                 //convertView 相當於緩存一樣,隻要我們判斷一下它是不是為null,就可以知道現在這個view有沒有繪製過出來
  49.                 //如果沒有,那麼就重新繪製,如果有,那麼就可以使用緩存啦,這樣就可以大大的節省view繪製的時間了,進行了優化,使ListView更加流暢
  50.                 MainViews views;
  51.                 View view;
  52.                 if(convertView == null)
  53.                 {
  54.                         views = new MainViews();
  55.                         view = inflater.inflate(R.layout.main_item, null);
  56.                         views.imageView = (ImageView) view.findViewById(R.id.iv_main_icon);
  57.                         views.textView = (TextView) view.findViewById(R.id.tv_main_name);
  58.                         views.imageView.setImageResource(ICONS[position]);
  59.                         views.textView.setText(NAMES[position]);
  60.                        
  61.                         view.setTag(views);
  62.                 }
  63.                 else
  64.                 {
  65.                         view = convertView;
  66.                         views = (MainViews) view.getTag();
  67.                         views.imageView = (ImageView) view.findViewById(R.id.iv_main_icon);
  68.                         views.textView = (TextView) view.findViewById(R.id.tv_main_name);
  69.                         views.imageView.setImageResource(ICONS[position]);
  70.                         views.textView.setText(NAMES[position]);
  71.                 }
  72.                        
  73.                 if(position == 0)
  74.                 {
  75.                         String name = sp.getString("lostName", "");
  76.                         if(!name.equals(""))
  77.                         {
  78.                                 views.textView.setText(name);
  79.                         }
  80.                 }
  81.                
  82.                 return view;
  83.         }
  84.        
  85.         //==================================================================================
  86.        
  87.         //一個存放所有要繪製的控件的類
  88.         private class MainViews
  89.         {
  90.                 ImageView imageView;
  91.                 TextView textView;
  92.         }
  93.        
  94. }

複製代碼
就這樣,我們的GridView就優化好啦, 大家是不是看到別人的應用的Button按下去,或獲得焦點,都會有不同的顯示的,其實也很簡單,我們現在就為我們之前的那些對話框加上這一效果,其實這些在api文檔裏麵也是有的,在我們的自定義圖片這裏麵就有說到在那裏找到那些東西的,有興趣的可以去看看現在我們要在drawable目錄下麵新建一個xmlbutton_selector.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:andro >
  3.    
  4.     <item android:state_pressed="true" android:drawable="@drawable/title_background"></item>
  5.     <item android:state_focused="true" android:drawable="@drawable/title_background"></item>
  6.     <item android:drawable="@drawable/button_normal" /><!-- 這個是默認狀態下的 -->

  7. </selector>

複製代碼
就這樣子,我們的一個button在按下去時就會顯示成不同的樣子的啦,其實還有其他屬性的,有興趣的可以去api那裏找一下 好啦,現在隻要你想要在那一個Button顯示成這個樣子,那麼你隻要把它的Background指定成這個xml就行的啦
  1.             <Button
  2.                 android:
  3.                 android:layout_width="140dip"
  4.                 android:layout_height="40dip"
  5.                 android:background="@drawable/button_selector"
  6.                 android:text="@string/protectedYes"/>
複製代碼
現在我們如法泡製,為我們的GridView也添加這樣一樣樣式,在按下去時,顯示有所不同在drawable下麵新建一個xmlitem_background_selector.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:andro >
  3.    
  4.     <item android:state_pressed="true" android:drawable="@drawable/item_background_select"></item>

  5. </selector>

複製代碼
是不是很簡單的呢,不過,要在GridView裏麵顯示這個,那個指定方式,就有些不同啦,我們在GridView裏麵指定一個這樣的屬性就可以的啦 listSelector
  1. <GridView
  2.         android:
  3.         android:layout_width="match_parent"
  4.         android:layout_height="match_parent"
  5.         android:listSelector="@drawable/item_background_selector"
  6.         android:verticalSpacing="8dip"
  7.         android:layout_marginTop="10dip"
  8.         android:numColumns="2" />
複製代碼
就這樣,我們就可以指定GridView的item按下去時,會顯示成不同的樣子啦 好啦,今天就到這裏啦,如果有什麼不明白的,歡迎留言,也可以去看一下,我們之前的文章,畢竟是一直承接下來的,是一個完整的項目來的。Security_06GridView的優化與修改Button的顯示樣式.rar(609.73 KB, 下載次數: 135)

最後更新:2017-04-03 12:53:36

  上一篇:go 手機衛士10-手機被盜後定位實現
  下一篇:go 劍指Offer之二叉樹的深度