AndroidのBaseAdapter


BaseAdapterは、Androidアプリケーションでよく使用されるベースデータアダプタについて、インタフェースクラスのAdapterから継承されたListView、Spinner、Gallery、GridViewなどのUI表示コンポーネントにデータのセットを転送するのが主な用途です.(静寂から遠ざかるhttp://www.cnblogs.com/mandroid/archive/2011/04/05/2005525.html)
1、Adapter類の紹介
1)、Adapter関連クラス構造を下図に示す.
201104050128502247.png
Adapterサブクラスをカスタマイズするには、上記のいくつかの方法を実装する必要があります.最も重要なのはgetView()メソッドです.これは、ListViewの各行のTextView、Galleryの各ImageViewなど、データを取得したViewコンポーネントを返すことです.
2)、AdapterはAndroidアプリケーションにおいて非常に重要な役割を果たし、アプリケーションも非常に広く、データソースとUIコンポーネントの架け橋と見なすことができ、Adapter、データとUIの関係は下図で表すことができる.
20110405012853870.png
3)、常用サブクラス
201104050128551162.png
2、BaseAdapter概要BaseAdapterはListAdapterとSpinnerAdapterの2つのインタフェースを実現しており、もちろんListViewやSpinnerなどのUIコンポーネントに直接データを提供することもできる.
関連クラス構造は次の図のようになります.
201104050128583373.png
BaseAdapterを継承した後、getCount、getItem、getItemId、getViewの4つのメソッドを書き換える必要があります.
最も重要なメソッドはgetViewメソッドで、呼び出しプロセスは次のとおりです.
まずgetCountメソッドを呼び出し、Itemの数を取得した後、Itemを描画するたびにgetViewメソッドを呼び出します.
この方法で事前に定義したXMLを表示効果とし,ItemとしてViewオブジェクトを返して表示する.
これもアダプタの主な変換機能を完了しました.getItemメソッドとgetItemIdメソッドは、ListViewレスポンスが呼び出されます.
呼び出し、getItemIdメソッドの機能実装が完了していない場合、ListViewのgetItemIdAtPositionを呼び出す
メソッドは、対応するアダプタを呼び出すgetItemIdメソッドであるため、所望の結果が得られません.
ListViewはフォーカスの問題を取得できません:
ListViewでは、Itemクリックが反応せず、フォーカスが得られないという問題が予想されがちです.原因は、あなた自身にあることが多いからです.
定義されたItemにはImageButton,Button,CheckBoxなどのサブコントロール(ButtonまたはCheckableともいえる)が存在する
サブクラスコントロール)では、これらのサブコントロールがフォーカスを取得するため、itemをクリックするとサブコントロールが変化し、item自体のクリックに応答しないことが多い.
この場合、descendantFocusabilityを使用して問題を解決する必要があります.APIの説明は以下の通りである.
android:descendantFocusability
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
Must be one of the following constant values.
1350460358_5684.jpg
このプロパティは、viewにフォーカスを取得するときにviewGroupとそのサブコントロールの関係を定義します.
属性の値は3種類あります.
beforeDescendants:viewgroupはサブクラスコントロールを優先してフォーカスを取得します
afterDescendants:viewgroupは、サブクラスコントロールがフォーカスを取得する必要がない場合にのみフォーカスを取得します.
blocksDescendants:viewgroupはサブクラスコントロールを上書きして直接フォーカスを取得します
一般的には、Itemレイアウトのルートレイアウトにandroid:descendantFocusability=「blocksDescendants」のプロパティを付けると3つ目になります.
3、例
例1:Galleryは画像のセットを表示します
実行結果:
2011040523501671.png
説明:上の行の画像はGalleryギャラリーで、1つのGallery画像をクリックするたびに、同時に下に大きな図の形式で表示されます.
レイアウトファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    
<Gallery 
    android:id="@+id/gallery1" 
    android:layout_width="match_parent" 
    android:spacing="5px" 
    android:layout_height="wrap_content" 
></Gallery>
<ImageView
    android:id="@+id/iv"
    android:layout_gravity="center_vertical"
    android:layout_marginTop="20px"
    android:layout_width="320px"
    android:layout_height="320px"
    ></ImageView>
    
</LinearLayout>

MainActivityクラス:
package com.magc.adapter;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity {
    private Gallery gallery;
    private ImageView imgview;
    private int[] imgs = {R.drawable.a6,R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5};
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgview = (ImageView)findViewById(R.id.iv);
        gallery = (Gallery)findViewById(R.id.gallery1);
        MyImgAdapter adapter = new MyImgAdapter(this);
        gallery.setAdapter(adapter);
        gallery.setOnItemClickListener(new OnItemClickListener() {
            //       ,     ResourceID     ImageView  ,
            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                    long arg3) {
                
                imgview.setImageResource(imgs[position]);
                
            }
        });
    }
    
     class MyImgAdapter extends BaseAdapter {
     //     Adapter         MainActivity ,    MainActivity      ,   imgs  
            private Context context;//         Context  
            public MyImgAdapter(Context context) {
                super();
                this.context = context;
            }

            @Override
            public int getCount() {
                return imgs.length;
            }

            @Override
            public Object getItem(int position) {
                return position;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //       (      ID)    ImageView  ,
                ImageView iv = new ImageView(context);//         Context  ,
                iv.setImageResource(imgs[position]);
                Log.i("magc", String.valueOf(imgs[position]));
                iv.setLayoutParams(new Gallery.LayoutParams(80, 80));//  Gallery          80*80。
                iv.setScaleType(ImageView.ScaleType.FIT_XY);
                return iv;
            }
        }
    
}