blog

Android開発チュートリアル 10: データバインディングData Binding

前述したように、これは派生したものです。この例では、Gallery や Spinner と共通する ListView を表示しています。...

Oct 25, 2013 · 7 min. read
シェア

AndroidGraphics2DTutorialで述べたように、ListViewを表示するListActivityから派生したもので、GalleryやSpinnerと共通するのは、これらはすべてAdapterViewのサブクラスであるということです。AdapterView の表示はデータバインディングによって実現され、 データソースは配列でもデータベースレコードでもかまいません。AdapterView は、Adapter を介してデータソースを表示したり、 ユーザの選択処理を行うことができます。

AndroidGraphics2DTutorial は、AndroidManifest.xml の Intent-Filter を次のように読み取ります。

public class AndroidGraphics2DTutorial extends ListActivity {  
     private static final String SAMPLE_CATEGORY 
              ="com.pstreets.graphics2d.SAMPLE_CODE";      
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState);     
      setListAdapter(new SimpleAdapter(this, getData(), 
        android.R.layout.simple_list_item_1, new String[] { "title" }, 
        new int[] { android.R.id.text1 })); 
      getListView().setTextFilterEnabled(true);  
     }    
     protected List getData() { 
      List<Map> myData = new ArrayList<Map>();    
      Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
      mainIntent.addCategory(SAMPLE_CATEGORY);    
      PackageManager pm = getPackageManager(); 
      List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);   
        if (null == list) 
       return myData;     
      String[] prefixPath;    
      prefixPath = null;      
      int len = list.size();      
      Map<String, Boolean> entries = new HashMap<String, Boolean>();      
      for (int i = 0; i < len; i++) { 
       ResolveInfo info = list.get(i); 
       CharSequence labelSeq = info.loadLabel(pm); 
   String label = labelSeq != null ? labelSeq.toString() 
         : info.activityInfo.name; 
       String[] labellabelPath = label.split("/");     
       String nextLabel = prefixPath == null ? labelPath[0] 
         : labelPath[prefixPath.length];  
       if ((prefixPath != null ? prefixPath.length : 0) 
    == labelPath.length - 1) { 
        addItem(myData, 
          nextLabel, 
          activityIntent( 
            info.activityInfo.applicationInfo.packageName, 
            info.activityInfo.name)); 
       } else { 
        if (entries.get(nextLabel) == null) { 
         addItem(myData, nextLabel, browseIntent(nextLabel)); 
         entries.put(nextLabel, true); 
        } 
       }      
      } 
      Collections.sort(myData, sDisplayNameComparator);   
      return myData; 
     } 
      
     private final static Comparator<Map> sDisplayNameComparator 
    = new Comparator<Map>() { 
      private final Collator collator = Collator.getInstance();   
      public int compare(Map map1, Map map2) { 
       return collator.compare(map1.get("title"), map2.get("title")); 
      } 
     }; 
      
     protected Intent activityIntent(String pkg, String componentName) { 
      Intent result = new Intent(); 
      result.setClassName(pkg, componentName); 
      return result; 
     }    
     protected Intent browseIntent(String path) { 
      Intent result = new Intent(); 
      result.setClass(this, AndroidGraphics2DTutorial.class); 
      return result; 
     }    
     protected void addItem(List<Map> data, String name, Intent intent) { 
      Map<String, Object> temp = new HashMap<String, Object>(); 
      temp.put("title", name); 
      temp.put("intent", intent); 
      data.add(temp); 
     }    
     @Override 
     protected void onListItemClick(ListView l, View v, 
        int position, long id) { 
      Map map = (Map) l.getItemAtPosition(position); 
      Intent intent = (Intent) map.get("intent"); 
      startActivity(intent); 
     } 
    } 

データ表示レイアウトを使用して、上記のコードで

ListActivityのListView用アダプタを指定します。このアダプタのデータソースはgetData()で、getData()はManifest.xmlからサンプルActivityの対象リストをすべて取得します。 ここで、DataSourceはファイルから静的に読み込まれますが、DataSourceが配列などのデータソースの場合、プログラムの内容が値を変更する場合は、notifyDataSetChanged()でUIにデータが変更されたことを通知する必要があります。簡単に言うと、Androidのデータ バインディングは.Net WinFormやWPFのデータバインディングに似ています。

上記のコードではSimpleAdapterを使用し、Androidが提供するandroid.R.layout.simple_list_item_1を使用してデータを表示していますが、Andridではカスタムレイアウトを使用してデータを表示することもできます。カスタムアダプタとカスタムレイアウトを使ってデータを表示する場合は、後述します。

Read next

PCは死んだのか?そんなことはない!

PCの死に関する報道は非常に誇張されており、誰もがタブレットを手に入れ、キーボードとマウスを捨てていると言われています。しかし実際には、PCはまだ広く使われています。だから、「PCは死ぬ」と言うのはもうやめにしませんか?ありがとうございました。

Oct 25, 2013 · 5 min read