2012年11月22日木曜日

GoogleAppEngine(GAE)でのBasic認証に関して

GAEでBasic認証をした時に参考にしたサイトのメモ
@tomorierさんの記事が参考になりました。ありがとうございます。


おおまかに3つの手順
・filterを作る
・filterをweb.xmlでBasic認証したいサーブレットと結びつける
・アカウントとパスワードを管理するファイルを作成する

filterクラスもリンク先のリンク先にサンプルがある。

ちなみに、パスワードファイルの

 User1=test
User2=test2

は、アカウント名が左でパスワードが右ですね。

2012年11月15日木曜日

ListViewの内容取得(ListView拡張、カスタムListView、カスタムAdapter)

AndroidのListViewをカスタマイズしたい、データによって背景の色を変えたいと思っていろいろ調べたので分かった範囲でメモ。
やりたいこと
・ListViewの1行ごとの内容(オブジェクト)を取得
・取得したオブジェクト内のフラグによって背景色を塗り分ける
・1行内のレイアウトを自由に行う
・ListViewは1行ごとにレイアウトを指定できる。
 例)twitterみたいに、画像を左、アカウント名を右上、テキストを右下など



で、こんな感じにできた。




手順
1.ListViewの1行のレイアウトを作成
レイアウトをxmlで作る
idとかを指定しておく
【past_order_item.xml】



    
   

     
     
     
  
  
     
 



2.ListView自体のレイアウトの作成
説明することは特になし
(Activityに貼付けるレイアウトのこと)
【past_order.xml】
ここのTextViewはListViewに表示するリストが無い場合だけ表示される


 
 



3.ListViewの1行に貼付けたい情報やフラグをもったオブジェクトのクラスの宣言
  ここは自分で好きなようなクラスを作ってください。
  (※不必要なフィールドも書いてたりします)   【PastOrder.java】
public class PastOrder {
 private String order;   
 private String num;    
 private Long dateLong;
 private Date date;
 private String dateString;
 public PastOrder(String order, String num, String dateString) {
  super();
  this.order = order;
  this.num = num;
  this.dateString = dateString;
 }
 public String getOrder() {
  return order;
 }
 public void setOrder(String order) {
  this.order = order;
 }
 public String getNum() {
  return num;
 }
 public void setNum(String num) {
  this.num = num;
 }
 public String getFormatDate(){
  Date date = new Date(dateLong);
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd  HH:mm:ss", Locale.JAPAN);
  return sdf.format(date);
 }
 public boolean isCompleted() {
  return isCompleted;
 }
 public void setCompleted(boolean isCompleted) {
  this.isCompleted = isCompleted;
 }
 public String getDateString() {
  return dateString;
 }
 public void setDateString(String dateString) {
  this.dateString = dateString;
 }
}


4.アダプターの作成(ここがメイン!!)
アダプターとはListViewに貼付けたいデータとレイアウトへの貼付けを行うもの(であってる?)
アダプターの拡張をして、ここで背景の判定とかを行う

ArrayAdapterの拡張をおこなう
(ここでTは先ほど作ったPastOrderクラスとしている) コンストラクタ
 LayoutInflaterオブジェクトの生成
 1行ごとのレイアウトを指定して、データを貼付けたりできる
getView()・・・1行ごとに実行されるメソッド
 convertView==nullならinflate
 ポジションからT itemの取得
あとはitemオブジェクトを好きなように煮て食う
 (今回はオーダー情報から調理完了かどうかをみて背景色を変更する処理を行っている)

public class OrderArrayAdapter extends ArrayAdapter{
 private Context myContext;
 private LayoutInflater li;

 public OrderArrayAdapter(Context context, List objects) {
  super(context, 0, objects);
  myContext = context;
  li = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

   //ListViewの1行ごとに呼び出されるメソッド
  //ここで1行ごとオブジェクトを取得し、好きな処理を行う
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  int UNCOMPLETE_COLOR = myContext.getResources().getColor(R.color.status_item_background_complete);
  int COMPLETE_COLOR = myContext.getResources().getColor(R.color.status_item_background_uncomplete);

  if(convertView == null){
   convertView = li.inflate(R.layout.past_order_item, null);
  }
  //対象の行のアイテムを取得
  PastOrder pastOrder = (PastOrder)this.getItem(position);

  if(pastOrder != null){
   //テキストビューの生成
   TextView pastOrderName = (TextView)convertView.findViewById(R.id.pastOrderName);
   TextView pastOrderNum = (TextView)convertView.findViewById(R.id.pastOrderNum);
   TextView pastOrderDate = (TextView)convertView.findViewById(R.id.pastOrderDate);
   //1行のビューに名前、数量、日時の設定
   if(pastOrderName != null){
    pastOrderName.setText(pastOrder.getOrder());
   }
   if(pastOrderNum != null){
    pastOrderNum.setText(pastOrder.getNum());
   }
   if(pastOrderDate != null){
    pastOrderDate.setText(pastOrder.getDateString());
   }
   //背景色を調理完了かどうかで色分け
   if(pastOrder.isCompleted()){
    convertView.setBackgroundColor(COMPLETE_COLOR);
    Log.v("Adapter", position+"\t"+"comp"+"\t"+pastOrder.getOrder());
   }else{
    convertView.setBackgroundColor(UNCOMPLETE_COLOR);
    Log.v("Adapter", position+"\tuncomp"+"\t"+pastOrder.getOrder());
   }
  }
  return convertView;
 }
}


5.ListViewActivity
ListViewに貼付けるデータの生成
アダプターのセット

protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.past_order);
 //リストに貼付けるデータの作成
 List pastOrderList = createPastData2(result);
 //過去のオーダ情報をレイアウトに表示
 setPastOrderToView3(pastOrderList);
}
private List createPastData2(JSONArray jArr){
 //TODO PastOrderクラスのインスタンスを登録する
 List pastOrderList = new ArrayList();
 JSONObject jObj;
 for(int i = 0; i < jArr.length(); i++){
  try {
   jObj = jArr.getJSONObject(i);
        //---------------------------
        //ここでPastOrderインスタンスを作成し、リストに登録していく
   String order = jObj.getString("order");
   String num = jObj.getString("num");
   Long dateLong = jObj.getLong("date");
   Date date = new Date(dateLong);
   boolean completed = jObj.getBoolean("completed");
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd  HH:mm:ss", Locale.JAPAN);    
   PastOrder pastOrder = new PastOrder(order, num, sdf.format(date), completed);
   pastOrderList.add(pastOrder);
        //---------------------------
  } catch (JSONException e) {
   e.printStackTrace();
  }
 }
 return pastOrderList;
}
private void setPastOrderToView3(List pastOrderList){
 Log.v("Adapter", pastOrderList.size()+"-------");
 mOrderArrayAdapter = new OrderArrayAdapter(this,pastOrderList);
   //---------------------------
   //アダプターをセットする!正直メソッドにする必要はないッ!!!
 setListAdapter(mOrderArrayAdapter);
}
ほぼ、この流れで「オブジェクトをListViewに貼付けて、オブジェクトごとに背景色を塗り分ける」という処理が実装できるはず。
何かコメントなどあればお願いします。
(※いろいろ消してるのでたぶんこのままでは動きません)