2015年1月27日 星期二

Android GridView - 使用 BaseAdapter 建立 和 更新


在建立方面:


以下方法取自Kelvin Chan,使用BaseAdapter建立一個gridview,
並對gridview中每一格作出仔細的處理,藉此達成顯示不同的效果,
此方法雖然比較複雜,但可以套用在不同的控件上,例如ListView和
Spinner等等,可以說是萬能!














<-- 目標












 







Step 1 :  建立XML文件




























按上圖可見,在Project的res->layout 下有兩個xml文件,
1. activity_main.xml : 這個xml檔是用來規劃MainActivity.java
    在建立android project時已經預設建立好,無需再自行建立。
2. listitem.xml : 這個xml檔需要自行建立,
    方法是先R-click layout -> New -> Android XML file
    在 file : 打上listitem,其他設定default就好了。
    這個xml作用是用於規畫GridView中每個格仔的佈局。






Step 2 :  修改兩個 XML文件

1.在 activity_main.xml 中,


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      tools:context=".MainActivity" >


    <!-- 加設一個GridView -->
   
    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#DCDCDC"
        android:gravity="center"
        android:horizontalSpacing="1dp"

        android:verticalSpacing="1dp"
        android:numColumns="7"
        android:stretchMode="columnWidth"

     >
    </GridView>

   

   

</RelativeLayout>


- 灰色部份已經在建立Project時預設了,可以忽略,主要是增設黃色部份。
- horizontalSpacing : 定義列之間的間距
- verticalSpacing :定義欄之間的間距
- stretchMode:格子拉伸模式
  ( none:不要伸縮 /
   spacingWidth:拉伸每列的間距 /
   columnWidth:拉伸每格 /
   spacingWidthUniform:均勻拉伸間距)



2. 在listitem.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:orientation="vertical" >
   

    <TextView
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="#ffffff"
        android:textSize="20sp"
        android:id="@+id/tv"></TextView>

   
</LinearLayout>


註:TextView 將會題示數目字






Step 3 : 建立兩個自設類別及修改主程序


  1. package wtf.kyl.blog;
  2. import java.util.ArrayList;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.Color;
  6. import android.os.Bundle;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.GridView;
  12. import android.widget.TextView;

  13. public class MainActivity extends Activity {
  14.           // 宣告所需元件
  15.           GridView gv; 
  16.           Adapter adapter;  // 將會繼承baseadapter
  17.           Item item;   // 一個自設的class object, 指的是每個格仔, 待會需要create 42個 Item 物件
  18.           ArrayList <Item> ary_items;  // 就像一個容器裝載全部的 Item 物件
  19.           int total = 42; //  共需建立的格仔總數,預設就42吧

  20.          @Override
  21.          protected void onCreate(Bundle savedInstanceState) {
  22.                super.onCreate(savedInstanceState);
  23.                setContentView(R.layout.activity_main);
  24.        
  25.                GridView gv = (GridView) findViewById(R.id.gridview);
  26.            
  27.               ary_items = new ArrayList<Item>();  // 建立一個容器
  28.               addItems(total); // 自設類別方法處理建立Item物件, 日後在更新GridView時將會大派用場。
  29.               adapter = new Adapter(this, ary_items);  // 建立適調器,並傳入兩個Arguments,
  30.                                                                                // this指當前activity,ary_items就是容器,執行
  31.                                                                                // addItems()後,容器已經裝住了42個Item物件
  32.               gv.setAdapter(adapter);  // 告訴Gridview知道它的適調器是adapter
  33.        
  34.     }
  35.     public void addItems(int total){    // 自設方法
  36.            for(int i=1; i<=total; i++){  // loop total=42 times
  37.                 
  38.                  item = new Item(); // 每次建立一個item物件
  39.                  item.day = i;     // 告訴 item 物件中 day 這個變量的值是 i
  40.                 
  41.                  if(i%2==0) item.isEvenNumber = true;  // odd and even checking
  42.                  else item.isEvenNumber = false; 
  43.                 
  44.                  ary_items.add(item);   // 把item物件扔進容器ary_items
  45.                 
  46.            }
  47.     }
  48.    
  49.    
  50. }
  51.   class Item {   // 自設item類別
  52.       int day;
  53.       boolean isEvenNumber;
  54. }
  55. class Adapter extends BaseAdapter{
  56.    
  57.     Context context;  // context 會指向mainactivity
  58.     ArrayList<Item> ary_items;   // 容器,已經裝滿42個item物件
  59.     
  60.     // 自設Default Constructor,用以接收activity和容器
  61.     public Adapter(Context context, ArrayList<Item> ary_items){
  62.            this.context = context;   
  63.            this.ary_items = ary_items;
  64.     }
  65.    
  66.    // Overriding BaseAdapter中的內建方法
  67.     @Override
  68.     public int getCount() {   // item總數量
  69.         // TODO Auto-generated method stub
  70.         return ary_items.size();
  71.     }
  72.     @Override
  73.     public Object getItem(int arg0) {  // 無須理會,在處理點擊事件時才會調用
  74.         // TODO Auto-generated method stub
  75.         return 0;
  76.     }
  77.     @Override
  78.     public long getItemId(int arg0) {  // 無須理會,在處理點擊事件時才會調用
  79.          // TODO Auto-generated method stub
  80.         return 0;
  81.     }
  82.     @Override
  83.     public View getView(int arg0, View arg1, ViewGroup arg2) {  // arg0 = 每格的ID
  84.        
  85.        
  86.         if(arg1==null){
  87.             LayoutInflater a = LayoutInflater.from(context);   // LayoutInflater可以幫助我們把
  88.             arg1 = a.inflate(R.layout.listitem, null);          //  listitem中的佈局FIT返每一格的SIZE
  89.         }
  90.        
  91.         TextView tv = (TextView) arg1.findViewById(R.id.tv);
  92.         tv.setText(""+ary_items.get(arg0).day);
  93.         if(ary_items.get(arg0).isEvenNumber==true) tv.setTextColor(Color.RED);
  94.         if(ary_items.get(arg0).day == 26) tv.setBackgroundColor(Color.GREEN);
  95.         if(ary_items.get(arg0).day == 17) tv.setBackgroundColor(Color.YELLOW);
  96.         return arg1;  // arg1 指該格仔,android中視每一格為一個view
  97.     }
  98.       
  99. }





********************************

在更新方面:


增加兩個Button作測試,並利用adapter告知GridView需要更新






   






  <﹣﹣最終目標
















Step 1 : 在activity_main.xml檔加設Button控件


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
   
   
    <!-- 加設一個GridView -->
         
    <GridView
        android:id="@+id/gridview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#DCDCDC"
        android:gravity="center"
        android:horizontalSpacing="1dp"
        android:numColumns="7"
        android:stretchMode="columnWidth"
        android:verticalSpacing="1dp"
     >
    </GridView>

   
   
    <!-- 新增兩個Button, 用LinerLayout作打橫排序 -->
   
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">
   
   
      <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
       
     </Button>
     <Button
         android:id="@+id/button2"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"></Button>
    
     </LinearLayout>
</RelativeLayout>




Step 2 : 修改MainActivity.java


  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_main);
  5.        
  6.         GridView gv = (GridView) findViewById(R.id.gridview);
  7.            
  8.         ary_items = new ArrayList<Item>();
  9.         addItems(total);
  10.         adapter = new Adapter(this, ary_items);
  11.         gv.setAdapter(adapter);
  12.        
  13.        
  14.         // 增設兩個Button
  15.         Button btn_add = (Button) findViewById(R.id.button1);
  16.         btn_add.setText("add one");
  17.         Button btn_del = (Button) findViewById(R.id.button2);
  18.         btn_del.setText("delete one");
  19.        
  20.         // 建立點擊事件,需要import android.view.View.OnClickListener;
  21.   
  22.         btn_del.setOnClickListener(new OnClickListener(){
  23.             @Override
  24.             public void onClick(View arg0) {
  25.                    total--;   
  26.                    ary_items.clear();   // 把容器中的Item全部清除
  27.                    addItems(total);     // 重新加入Item
  28.                    adapter.notifyDataSetChanged(); // 利用Adapter告知GridView需要更新Item
  29.             }
  30.            
  31.         });
  32.        
  33.         btn_add.setOnClickListener(new OnClickListener(){
  34.             @Override
  35.             public void onClick(View arg0) {
  36.                 // TODO Auto-generated method stub
  37.                 total++;
  38.                 ary_items.clear();
  39.                 addItems(total);
  40.                 adapter.notifyDataSetChanged();
  41.                
  42.             }
  43.               
  44.         });
  45.        
  46.        
  47.     }


完成:D

沒有留言:

張貼留言