總網頁瀏覽量

關於我自己

我的相片
人生的必修課是接受無常,人生的選修課是放下執著。
顯示具有 Adapter 標籤的文章。 顯示所有文章
顯示具有 Adapter 標籤的文章。 顯示所有文章

2014年6月30日 星期一

取得ListView中Button的位置

某extends Activity的class以下列方式呼叫extends DialogFragment的class
InfoDialog dialog = new InfoDialog(context);
Bundle args = new Bundle();
args.putInt(InfoDialog.BUNDLE_KEY_PRIZE, -1);   
dialog.setArguments(args);
dialog.show();


InfoDialog extends DialogFragment內含ListView
Adapter adapter = new Adapter(context, deadlineList);
ListView lv = (ListView) dialog.findViewById(R.id.lv);   
lv.setAdapter(adapter);
lv.setOnItemClickListener(this);//無法work


Adapter extends BaseAdapter其內ListView又含Button的click事件, 為取得click的Button所在位置, 將code改寫成:
    ArrayList<String> adapter_deadline;
    class ViewHolder {
        TextView deadline;
        Button exchange;
    }
    public View getView(int position, View convertView, ViewGroup parent){             
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.adapter_listview_prize, null);
            holder = new ViewHolder();
            holder.deadline = (TextView)convertView.findViewById(R.id.summary);
            holder.exchange = (Button)convertView.findViewById(R.id.exchange);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.deadline.setText(.get(position).toString());

        OnClick listener = new OnClick(position);
        holder.exchange.setOnClickListener(listener);
        return convertView;
    }
    class OnClick implements OnClickListener {
        private int position;
        public OnClick(int position){
            this.position = position;
        }
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "position "+position, Toast.LENGTH_SHORT).show();
            LayoutInflater factory = LayoutInflater.from(context);
            final View view = factory.inflate(R.layout.layout_questionnaire, null);
            AlertDialog.Builder mAB = new AlertDialog.Builder(context);

            mAB.setView(view);         
            alert = mAB.create();
            alert.show();
        }
    }

2012年2月9日 星期四

自訂Adapter ~ 多欄位










ListViewActivity.java
package com.tstos.ListView_Adapter;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class ListViewActivity extends Activity 
{
 TextView textview1;
 TextView textview2;
 TextView listview_title_column1;
 TextView listview_title_column2;
 TextView listview_title_column3;
 GridView gridview1;
 ListView listview1;
 ImageView imageview1;
 String[] android_version;
 String[] android_level;
 String[] android_code;
 Adapter_ListViewActivity adapter;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      
      textview1 = (TextView)findViewById(R.id.TextView1);
      textview2 = (TextView)findViewById(R.id.TextView2);
      listview_title_column1 = (TextView)findViewById(R.id.ListView_title_column1);
      listview_title_column2 = (TextView)findViewById(R.id.ListView_title_column2);
      listview_title_column3 = (TextView)findViewById(R.id.ListView_title_column3);
      listview1 = (ListView)findViewById(R.id.ListView1);
      imageview1 = (ImageView) findViewById(R.id.ImageView1);
      
      //載入default陣列
      android_version = getResources().getStringArray(R.array.lstview_array_column1);
      android_level = getResources().getStringArray(R.array.lstview_array_column2);
      android_code = getResources().getStringArray(R.array.lstview_array_column3);
      adapter = new Adapter_ListViewActivity(ListViewActivity.this, 
                 R.layout.simple_list_item_1_small, 
                 android_version, 
                 android_level, 
                 android_code);  
      
      listview1.setAdapter(adapter);
      //定義ListView的點擊行為
      listview1.setOnItemClickListener(new GridView.OnItemClickListener()
      {
        public void onItemClick(AdapterView parent, View v, int position, long arg3)
        {
         textview1.setText(android_version[position]);
         switch(position)
         {
         case 0://1.0          
          imageview1.setAlpha(0);//將圖片設為完全透明
          textview2.setText(getResources().getString(R.string.no_code_name));
          break;
         case 1://1.1
          imageview1.setAlpha(0);
          textview2.setText(getResources().getString(R.string.no_code_name));
          break;
         case 2://1.5
          imageview1.setAlpha(255);//將圖片設為不透明
          imageview1.setImageResource(R.drawable.cupcake);
          textview2.setText(getResources().getString(R.string.cupcake));
          break;
         case 3://1.6
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.donut);
          textview2.setText(getResources().getString(R.string.donut));
          break;
         case 4://2.0
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.eclair);
          textview2.setText(getResources().getString(R.string.eclair));
          break;
         case 5://2.0.1
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.eclair);
          textview2.setText(getResources().getString(R.string.eclair));
          break;
         case 6://2.1
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.eclair);
          textview2.setText(getResources().getString(R.string.eclair));
          break;
         case 7://2.2
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.froyo);
          textview2.setText(getResources().getString(R.string.froyo));
          break;
         case 8://2.3
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.gingerbread);
          textview2.setText(getResources().getString(R.string.gingerbread));
          break;
         case 9://2.3.3 - 2.3.4
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.gingerbread);
          textview2.setText(getResources().getString(R.string.gingerbread));
          break;
         case 10://3.0
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.honeycomb);
          textview2.setText(getResources().getString(R.string.honeycomb));
          break;
         case 11://3.1
          imageview1.setAlpha(255);
          imageview1.setImageResource(R.drawable.honeycomb);
          textview2.setText(getResources().getString(R.string.honeycomb));
          break;
         }
        }
      });
    }
}

2012年1月24日 星期二

撈出聯絡人資料 ~ 照片 ~ 並換圖 BitmapFactory.decodeByteArray







要讀取聯絡人資料記得Manifest.xml中要加入




Launch這個AP後, 會撈出Device中聯絡人的資料, 列出有人名(ContactsContract.Contacts.DISPLAY_NAME有值)的資料, 並抓出聯絡人圖片, 如果沒設的就顯示

本範例目的在自行更換圖示, 所以用了兩個Activity -> 選擇要換圖的item後 -> open另一個Activity選圖
















換換換~
帶有圖片的Toast



如此我們便可以任意更換聯絡人圖示~不過這個AP並沒有真正寫入資料到ContactsContract.Contacts,也沒有建立資料庫存放, 所以關閉後所有的變更就會不見囉.
















ContactPhotoActivity.java
package com.tsots.GridView_Contact_ChangePhoto;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
  
public class ContactPhotoActivity extends Activity 
{  
 Context context = ContactPhotoActivity.this;
 List total_contact_id= new ArrayList();
 List contact_name= new ArrayList();
 List contact_photo= new ArrayList();
 GridView g1;
 String photoId;  
 String tag = "com.tsots.GridView_Contact_ChangePhoto / ContactPhotoActivity.java";
 int num_contact=0;
 int num_contact_photo=0;
 int contact_id;
 int photo;
 Bitmap photoBitmap;
 Bitmap tmp_photoBitmap;
 Bitmap map; 

 /** Called when the activity is first created. */  
 @Override  
    public void onCreate(Bundle savedInstanceState) 
 {  
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);  
  
  g1 = (GridView) findViewById (R.id.gridview1); 
  //陣列內容: 從contact撈出有顯示名稱的資料
  final String[] selectNameColumn = new String[]{
                                          ContactsContract.Contacts._ID, 
                                          ContactsContract.Contacts.DISPLAY_NAME
                                          };
        final Cursor cursor_ContactName = getContentResolver().query(  
                            Contacts.CONTENT_URI,  //要查詢的表格
                            selectNameColumn,      //要回傳的欄位組合
                            null,  
                            null,  
                            null
                             );  
        try
        {
         cursor_ContactName.moveToFirst();                                              
         do
         {                 
          /*****************************聯絡人在被建立時該id***************************************
           * int idColumn = cursor_ContactName.getColumnIndex(ContactsContract.Contacts._ID);
           * String contactId = cursor_ContactName.getString(idColumn);//會丟入59筆資料
           *****************************等於*****************************************************/
          String contactId = cursor_ContactName.getString(0);  //回傳有DISPLAY_NAME的資料,個人Device有59筆        
          
          /*****************************聯絡人姓名***********************************************
           * final int nameColumn = cursor_ContactName.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
           * String contactName = cursor_ContactName.getString(nameColumn);
           *****************************等於*****************************************************/
          String contactName = cursor_ContactName.getString(1);

          try
          {                  
           byte[] photo = getPhoto(contactId);   //只會得到24筆資料
           num_contact++;
                 map = BitmapFactory.decodeByteArray(photo, 0, photo.length); 
                 total_contact_id.add(String.valueOf(contactId));
                 contact_name.add(num_contact + " " + String.valueOf(contactName));                 
                 contact_photo.add(map);
             }
                catch(Exception e)
                {
                 System.out.println("e = "+e); 
                }
            }while(cursor_ContactName.moveToNext());

            Adapter_ContactPhotoActivity adapter = new Adapter_ContactPhotoActivity(
                                  this,   
                                  contact_name,
                                  contact_photo
                         );
            g1.setNumColumns(3);    //每排3筆資料
            g1.setAdapter(adapter); //自訂的Adapter

            /*
             * 加入GridView的點擊事件
             * 記錄user點選的位置到"CONTACT_POSITION", 這個數值是在PhotoSelect.java中選好換圖事件後,
             * 所要對哪個聯絡人欄位變更資訊的依據
             */
            class  ItemClickListener implements OnItemClickListener
            {
             public void onItemClick(AdapterView arg0,//The AdapterView where the click happened   
                   View v,             //The view within the AdapterView that was clicked  
                   int position,       //The position that be clicked  
                   long id             //The row id of the item that was clicked  
                     ) 
             {                  
              Intent intent = new Intent(context, PhotoSelect.class);
              Bundle bundle = new Bundle();
              bundle.putInt("CONTACT_POSITION", position);
              intent.putExtras(bundle);
              Log.i(tag, "select position : "+position);
              Log.i(tag, "select contact_name : "+contact_name.get(position));
              startActivityForResult(intent,0);
             }
            }
            g1.setOnItemClickListener(new ItemClickListener());       
        }
        finally
        {
         cursor_ContactName.close();
        }
 }
 
 /*
  * 這個function負責從聯絡人中撈出有PHOTO_ID的資料, 並以byte[]的型態回傳
  */
 public byte[] getPhoto(String people_id) 
 {
  byte[] contactIcon = null;
  String photo_id = null;
  String selection1 = ContactsContract.Contacts._ID + " = " + people_id; 
  Cursor cur_select_name = getContentResolver().query(
               ContactsContract.Contacts.CONTENT_URI, /*搜尋對象*/
               null, 
               selection1,                            /*條件*/
               null,
               null
              );
  //會丟入59筆資料    
  if (cur_select_name.getCount() > 0) 
  {
   cur_select_name.moveToFirst();
   photo_id = cur_select_name.getString(cur_select_name.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
  }
  String[] projection = new String[] {ContactsContract.Data.DATA15}; 
  String select_photo = ContactsContract.Data._ID + " = " + photo_id;  //只抓有photo的data
  //String selection = ContactsContract.Data._ID;  //抓所有有名字的data, 且沒有抓到photo值

  Cursor cur_select_photo = getContentResolver().query(
                 ContactsContract.Data.CONTENT_URI, //要查詢的表格        
                 projection,                        //要回傳的欄位組合
                 select_photo,                      //符合這個限制資料的才會回傳
                 null,                              //前一個參數的參數
                 null                               //排序
                );
  //會丟入59筆資料    
  cur_select_photo.moveToFirst();
  /*
   * 若由DISPLAY_NAME過濾後的資料裡, 沒有聯絡人圖片的, 統一給一個圖示, 從.png裡抓
   */
  if(cur_select_photo.getCount() == 0)
  {
   //將圖檔轉成Bitmap
   tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.widget_stock_addnewstock_btn_normal);  
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   //將.png的圖檔轉成Bitmap
   tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);                                                  
   contactIcon = baos.toByteArray();
   return contactIcon;
  }
  else
  {
   //只會得到24筆資料
   contactIcon = cur_select_photo.getBlob(0);
   return contactIcon;
  }
 }
 
 /*
  * 從PhotoSelect.java操作完選圖的動作
  * 傳回"CONTACT_POSITION"和"CONTACT_PHOTO"到ContactPhotoActivity.java
  */
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) 
 {
  super.onActivityResult(requestCode, resultCode, data);
  switch(resultCode)
  {
   case RESULT_OK:
    Bundle bundle_from_PhotoSelect = data.getExtras();
    contact_id = bundle_from_PhotoSelect.getInt("CONTACT_POSITION");
    photo = bundle_from_PhotoSelect.getInt("CONTACT_PHOTO");
    changePhoto(contact_id, photo);
    break;
  }
 }
 
 public void changePhoto(int id, int photo)
 {  
     tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), photo);     //將int轉成Bitmap
  ByteArrayOutputStream baos_from_PhotoSelect = new ByteArrayOutputStream(); //將Bitmap轉成ByteArrayOutStream
  tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos_from_PhotoSelect);                                                  
  byte[] byte_from_PhotoSelect = baos_from_PhotoSelect.toByteArray();        //將ByteArrayOutStream轉成byte
        map = BitmapFactory.decodeByteArray(byte_from_PhotoSelect, 0, byte_from_PhotoSelect.length);//將byte轉成Bitmap
     contact_photo.set(id, map);    //可以改變contact_photo
     //contact_name.set(id, "xxx"); //可以改變contact_name   
     
        Adapter_ContactPhotoActivity adapter = new Adapter_ContactPhotoActivity(
                                 this,   
                                 contact_name,
                                 contact_photo
                        );
        g1.setNumColumns(3);    //每排3筆資料
        g1.setAdapter(adapter); //自訂的Adapter
 }
 } //

2012年1月11日 星期三

撈出聯絡人資料 ~ 照片 ContactsContract.Contacts.PHOTO_ID







要讀取聯絡人資料記得Manifest.xml中要加入


ContactPhotoActivity.java

package com.tsots.ContactPhotoActivity;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.widget.GridView;
  
public class ContactPhotoActivity extends Activity 
{  
 GridView g1;
 String photoId;
 Bitmap photoBitmap;
 List contact_name= new ArrayList();
 List contact_photo= new ArrayList();
 int num_contact=0;
 int num_contact_photo=0;
 Bitmap tmp_photoBitmap;
 
 /** Called when the activity is first created. */  
 @Override  
    public void onCreate(Bundle savedInstanceState) 
 {  
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);  
  g1 = (GridView) findViewById (R.id.gridview1);  
  Uri contacts = Contacts.CONTENT_URI;
  //陣列內容: 從contact撈出有顯示名稱的資料
  String[] selectNameColumn = new String[]{
                                        ContactsContract.Contacts._ID, 
                                        ContactsContract.Contacts.DISPLAY_NAME
                                       };
        Cursor cur = getContentResolver().query(  
                   contacts,          //要查詢的表格
                   selectNameColumn,  //要回傳的欄位組合
                   null,  
                   null,  
                   null
                    );  
        try
        {
         if (cur.moveToFirst()) 
         {                  
          int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
          int nameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
          do
          {                  
           String contactId = cur.getString(idColumn);//回傳有DISPLAY_NAME的資料,個人Device有103筆                  
           try
           {
            byte[] photo = getPhoto(contactId);   //只回傳有PHOTO_ID的資料,個人Device有24筆
            num_contact++;
            //將byte轉成Bitmap
                  Bitmap map = BitmapFactory.decodeByteArray(photo, 0, photo.length);                      
                  contact_name.add(num_contact + " " + String.valueOf(cur.getString(nameColumn)));
                  contact_photo.add(map);
              }
                 catch(Exception e)
                 {
                   
                 }
             }while(cur.moveToNext());
                 
             PhotoAdapter adapter = new PhotoAdapter(
                           this,   
                           contact_name,
                           contact_photo
                  );
             g1.setNumColumns(3);    //每列3筆資料
             g1.setAdapter(adapter); //自訂的Adapter
         }
        }
        finally
        {
         cur.close();
        }
 }
 
 /*
  * 這個function負責從聯絡人中撈出有PHOTO_ID的資料, 並以byte[]的型態回傳
  */
 public byte[] getPhoto(String people_id) 
 {
  byte[] contactIcon = null;
  String photo_id = null;
  String select_name = ContactsContract.Contacts._ID + " = " + people_id; 
  Cursor cur_select_name = getContentResolver().query(
                 ContactsContract.Contacts.CONTENT_URI, 
                 null, 
                 select_name, 
                 null,
                 null
                   );
  //會丟入103筆資料    
  if (cur_select_name.getCount() > 0) 
  {
   cur_select_name.moveToFirst();
   photo_id = cur_select_name.getString(cur_select_name.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
  }
  String[] projection = new String[] {ContactsContract.Data.DATA15}; 
  String select_photo = ContactsContract.Data._ID + " = " + photo_id;  //只抓有photo的data
  //String selection = ContactsContract.Data._ID;        //抓所有有名字的data, 且沒有抓到photo值

  Cursor cur_select_photo = getContentResolver().query(
                     ContactsContract.Data.CONTENT_URI, //要查詢的表格        
                     projection,                        //要回傳的欄位組合
                     select_photo,                      //符合這個限制資料的才會回傳
                     null,                              //前一個參數的參數
                     null                               //排序
               );
  //會丟入59筆資料    
  cur_select_photo.moveToFirst();
  /*
   * 若由DISPLAY_NAME過濾後的資料裡, 沒有聯絡人圖片的, 統一給一個圖示, 從.png裡抓
   */
  if(cur_select_photo.getCount() == 0)
  {
   tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.widget_stock_addnewstock_btn_normal);  //將圖檔轉成Bitmap
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); //將.png的圖檔轉成Bitmap
   contactIcon = baos.toByteArray();
   return contactIcon;
  }
  else
  {
   //只會得到24筆資料
   contactIcon = cur_select_photo.getBlob(0);
   return contactIcon;
  }
 }
 } //

2012年1月10日 星期二

圖片瀏覽 ~ GridView與Adapter的結合








GridViewActivity.java

package com.tsots.GridView_Adapter_Pic;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

public class GridViewActivity extends Activity 
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(this));

        //GridView的點選事件, 傳入int position知user點選哪一個item
        gridview.setOnItemClickListener(new OnItemClickListener() 
        {
            public void onItemClick(AdapterView parent, View v, int position, long id) 
            {
                Toast.makeText(GridViewActivity.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

2012年1月9日 星期一

色碼表 ~ GridView與Adapter的結合








本範例以BackgroundAdapter.java extends BaseAdapter來改變GridView的背景圖, 並以一個覆蓋全畫面的ImageView增添OnClickListener事件, 讓user可以切換色系的名稱與編碼.

另外為了讓畫面保持在橫向狀態, 必須在Manifest.xml的Activity標籤中加入android:screenOrientation="landscape"的屬性






GridViewActivity.java

package com.tsots.GridView_Adapter_Color;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;

public class GridViewActivity extends Activity 
{
 GridView gridview;
 ImageView imageview;
 String[] items;
 int temp = 0;
 BackgroundAdapter mygridviewadapter;
 int[] color = {
     R.color.darkred,    R.color.crimson,   R.color.red,     R.color.firebrick, 
     R.color.purple,    R.color.blueviolet, R.color.orchid,    R.color.pink,
     R.color.mediumvioletred, R.color.deeppink,   R.color.magenta,    R.color.lightcoral,  
     R.color.darkgreen,    R.color.green,   R.color.limegreen,   R.color.lightgreen,
     R.color.lime,     R.color.lawngreen,  R.color.greenyellow, R.color.paleolivine,      
     R.color.darkblue,    R.color.blue,    R.color.paleblue,    R.color.lightblue, 
     R.color.darkaqua,    R.color.aqua,    R.color.paleaqua,    R.color.lightaqua,      
     R.color.black,     R.color.gray,    R.color.silver,    R.color.white,
     R.color.darkorange,   R.color.orange,   R.color.paleorange,  R.color.lightorange, 
     R.color.gold,     R.color.yellow,   R.color.paleyellow,  R.color.lightyellow           
      };
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        gridview = (GridView) findViewById (R.id.gridview);
        imageview = (ImageView) findViewById (R.id.imageview);
        items = getResources().getStringArray(R.array.colorname_array);
        imageview.setOnClickListener(new View.OnClickListener() 
        {   
   public void onClick(View v) 
   {    
    if (temp == 0)
          {
     items = getResources().getStringArray(R.array.colorcode_array);            
           temp = 1;
          }
          else
          {
     items = getResources().getStringArray(R.array.colorname_array); 
           temp = 0;
          }
    mygridviewadapter = new BackgroundAdapter(GridViewActivity.this, items, color);
             gridview.setAdapter(mygridviewadapter);
   }
  });      
        mygridviewadapter = new BackgroundAdapter(GridViewActivity.this, items, color);
        gridview.setAdapter(mygridviewadapter);
    }
}

2012年1月5日 星期四

SQLiteOpenHelper ~ 旅遊匯率隨時查(三)

這篇新增加一個可以自行輸入購買商品資訊的功能,
讓外出旅遊除了可以隨時計算匯率,
更可以紀錄自己敗了哪些東西啦~







為此,
除了修改layout (layout_exchangerate.xml),
再新增Adapter_ListView_Shopping.java來自訂第2個ListView的樣式, 其載入layout_adapter_listview_shopping.xml 內含三個TextView,
code的架構如下










Adapter_ListView_Shopping.java
package com.tsots.ExchangeRate;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class Adapter_ListView_Shopping extends BaseAdapter
{
 private LayoutInflater mInflater;
 List adapter_allarray_shopping_icon;
 List adapter_allarray_shopping_item;
 List adapter_allarray_shopping_nt;
 TextView column_shopping_icon;
 TextView column_shopping_item;
 TextView column_shopping_nt;

 public Adapter_ListView_Shopping
 (
   Context context,
   int simple_list_item_single_choice, 
   List allarray_shopping_icon,
   List allarray_shopping_item, 
   List allarray_shopping_nt
 ) 
 {
  mInflater = LayoutInflater.from(context);
  adapter_allarray_shopping_icon = allarray_shopping_icon;
  adapter_allarray_shopping_item = allarray_shopping_item;
  adapter_allarray_shopping_nt = allarray_shopping_nt;
 }

 public int getCount()
 {
  return adapter_allarray_shopping_item.size();
 }

 public Object getItem(int position)
 {
  return adapter_allarray_shopping_item.size();
 }
  
 public long getItemId(int position)
 {
  return position;
 }
  
 public View getView(int position,View convertView,ViewGroup parent)
 {   
  convertView = mInflater.inflate(R.layout.layout_adapter_listview_shopping,null);
  column_shopping_icon = (TextView)convertView.findViewById(R.id.column_shopping_icon);
  column_shopping_item = (TextView)convertView.findViewById(R.id.column_shopping_item);
  column_shopping_nt = (TextView)convertView.findViewById(R.id.column_shopping_nt);
      column_shopping_icon.setText(adapter_allarray_shopping_icon.get(position).toString());
      column_shopping_item.setText(adapter_allarray_shopping_item.get(position).toString());
      column_shopping_nt.setText(adapter_allarray_shopping_nt.get(position).toString());
     return convertView;
 }
}

在主程式的部份,
新增bt_save button的onClick事件,
將user所輸入的et_item和et_money值存入資料庫並更新到ListView (lv_shopping)

Activity_ExchangeRate.java
bt_save.setOnClickListener(new OnClickListener()
        {
   public void onClick(View v) 
   {
    et_item.getText().toString();
    et_money.getText().toString();
    //存入資料庫
    save_sqlite_table_listview_shopping();
    //另外呼叫function做setAdapter
    update_listview_shopping();
   }
        });

/*
* 更新ListView畫面資料
*/

Activity_ExchangeRate.java
public void update_listview_shopping()
    {
     Log.i(Tag, "設定listview_shopping內容");
     allarray_shopping_icon = new ArrayList();
     allarray_shopping_item = new ArrayList();
     allarray_shopping_nt = new ArrayList();
     Cursor cursor_sqlite_table_listview_shopping = null;
     try
     {
      cursor_sqlite_table_listview_shopping = dbHelper.select(tables[3], null, null, null, null, null, null);
      cursor_sqlite_table_listview_shopping.moveToFirst();
      do
      {
       allarray_shopping_icon.add(cursor_sqlite_table_listview_shopping.getString(0));
       allarray_shopping_item.add(cursor_sqlite_table_listview_shopping.getString(2));
       allarray_shopping_nt.add(cursor_sqlite_table_listview_shopping.getString(3));
      }while(cursor_sqlite_table_listview_shopping.moveToNext());
     }
     catch(Exception e)
     {
      System.out.println("501 Exception : update_listview()");
     }
     finally
     {
      cursor_sqlite_table_listview_shopping.close();
     }

     /*新增購物列表*/
     adapter_listview_shopping = new Adapter_ListView_Shopping
     (
      context, 
      android.R.layout.simple_list_item_1, 
      allarray_shopping_icon, 
      allarray_shopping_item,
      allarray_shopping_nt
     );
     //將ListAdapter的可選(Focusable)選單選項打開
     lv_shopping.setItemsCanFocus(true);
     lv_shopping.setFocusable(true);
     //設定ListView選單選項設為每次只能單一選項
     lv_shopping.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
     lv_shopping.setAdapter(adapter_listview_shopping); 
    }


/*
* 新增tables[3]內的資料
* {"fieldname_id", "fn_shopping_icon", "fn_shopping_item", "fn_shopping_nt"}
*/

Activity_ExchangeRate.java
public void save_sqlite_table_listview_shopping()
    {
     Log.i(Tag, "儲存tables[3]資料ing...");
     Cursor cursor_sqlite_table_listview_shopping = null;
  try
  { 
   cursor_sqlite_table_listview_shopping = dbHelper.select(tables[3], null, null, null, null, null, null);
   cursor_sqlite_table_listview_shopping.moveToFirst();  
   String[] updateFields = {"fn_shopping_icon", "fn_shopping_item", "fn_shopping_nt"};
   String[] updateValues = {"1", et_item.getText().toString(), et_money.getText().toString()};
   dbHelper.insert(tables[3], updateFields, updateValues);
      //dbHelper.update(tables[3], updateFields, updateValues, null, null);      
  }
  catch(Exception e)
  {
   System.out.println("219 Exception : save_sqlite_table_listview_shopping()");
  }
  finally
  {
   cursor_sqlite_table_listview_shopping.close();
  }
    }


最後加入lv_shopping的onItemClick事件,
讓user可以將加入過的資料做刪除

Activity_ExchangeRate.java
lv_shopping.setOnItemClickListener(new OnItemClickListener()
     {
   public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) 
   {
    intItemSelected = arg2;
    new AlertDialog.Builder(context)
          .setMessage("delete item "+arg2+" ?")
          .setPositiveButton("yes",new DialogInterface.OnClickListener()
          {
           public void onClick(DialogInterface dialog, int whichButton)
           {
               Cursor cursor_sqlite_table_listview_shopping = null;
               try
               {
                cursor_sqlite_table_listview_shopping = dbHelper.select(tables[3], null, null, null, null, null, null);
                   String where = "fieldname_id=?";
                   String[] whereValue = 
                   {
                    allarray_shopping_icon.get(intItemSelected)
                   };
                dbHelper.delete(tables[3], where, whereValue);
                update_listview_shopping();
               }
               catch(Exception e)
               {
                
               }
               finally
               {
                cursor_sqlite_table_listview_shopping.close();
               }
           }
          })
          .setNegativeButton("no", new DialogInterface.OnClickListener()
          {
           public void onClick(DialogInterface dialog, int whichButton)
           {
             
           }
          })
          .show();
   }      
     }); 

為使lv_shopping的"fn_shopping_icon"在Activity顯示重新編號, 修改以下部份

public void update_listview_shopping()
    {
    ...
try
{
      cursor_sqlite_table_listview_shopping = dbHelper.select(tables[3], null, null, null, null, null, null);
      cursor_sqlite_table_listview_shopping.moveToFirst(); 
      int count =0;
      do
      { 
       count++;
       //allarray_shopping_icon.add(cursor_sqlite_table_listview_shopping.getString(0)); 
       allarray_shopping_icon.add(String.valueOf(count));
       allarray_shopping_item.add(cursor_sqlite_table_listview_shopping.getString(2));
              allarray_shopping_nt.add(cursor_sqlite_table_listview_shopping.getString(3));
      }while(cursor_sqlite_table_listview_shopping.moveToNext());
     }
     ...
    }

lv_shopping.setOnItemClickListener(new OnItemClickListener()
     {
   public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) 
   {
...
try
               {
                cursor_sqlite_table_listview_shopping = dbHelper.select(tables[3], null, null, null, null, null, null);
                   String where = "fieldname_id=?";
cursor_sqlite_table_listview_shopping.moveToPosition(intItemSelected);
String[] whereValue = 
                   {
                    //allarray_shopping_icon.get(intItemSelected) 
cursor_sqlite_table_listview_shopping.getString(0)
};
                dbHelper.delete(tables[3], where, whereValue);
                update_listview_shopping();
               }
});