Android独学-ListView

9901 ワード

ListView
概要:ListViewでは、QQのチャット記録など、画面外のデータを指で上下にスライドさせることで画面内にスクロールできます.ListViewとは、同じレイアウトのViewを1つのリストに表示することです.
ListViewを使用するには、データアダプタAdapterを設定する必要があります.Adapterとは何ですか?
Adapter
An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.
1つのAdapterはAdapterViewビューとデータとの橋渡しであり、Adapterはデータへのアクセスを提供し、各データに対応するViewを生成した後、ListViewにViewを追加する.
直接言えば抽象的かもしれませんが、私たちの携帯電話の通信録は簡単なListViewです.連絡先には1つ1つの連絡先があり、各連絡先には対応する情報が表示されます.現在は通信録が簡単で、一般的には顔と名前しか表示されず、以前は携帯電話番号も表示されていました.各連絡先の表示方法はまたViewです.Adapterアダプタは、私たちの情報(顔と名前)を一定のフォーマットに従って各Viewに適合させ、ListViewにViewを追加します.この例に基づいて、ListViewコントロールとAdapterアダプタ、およびそれらの関係をよりよく理解しているかもしれません.
参照先http://www.cnblogs.com/gaobig/p/5016651.html

Adapterのコンストラクション関数には、 ListView id の3つのパラメータがあります.
Androidは多くのアダプタの実装クラスを提供しています.ここでは、テキストタイプのデータを転送するなど、汎用的に適切なデータを指定するArrayAdapterを見てみましょう.
private String[] data = {"a", "b", "c", "d", "e", "f", "g"};

@Override
protected void onCreate(Bindle savedInstanceState) {
  super.onCreate(saveInstanceState);
  setContentView(R.id.activity_main);
  //       ,  android.R.layout.simple_list_item_1        ,     TextView
  ArrayAdapter adapter = new ArrayAdapter(MainActivity.this,
                                    android.R.layout.simple_list_item_1, data);
  //  ListView        ,
  //  R.id.lsit_view     ListView  ,             ,           
  ListView listView = (ListView) findViewById(R.id.lsit_view);
  listView.setAdapter(adapter);
}

AdapterにはgetView()メソッドがあり、サブアイテムが画面内にスクロールされるたびにListViewに呼び出され、何に使用されますか?もちろん現在のListViewのサブアイテムに1つのViewを入力するので、当然このメソッドはViewタイプを返すので、ListViewのサブアイテムレイアウトをカスタマイズする場合は、自分で1つのViewを新規作成してからカスタムレイアウトのコントロールでViewにバインドすることができます.
どうやって縛るの?次の例を見てみましょう.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view = LayoutInflater.from(getContext()).inflate(        id, parent, false);
  // View        , :
  TextView text = (TextView) view.findViewById(R.id.text);
  text.setText("Hello");
  return view;
}

ここではLayoutInflater.from(getContext()).inflate()をもう一度説明する必要があります.LayoutInflater.from(getContext())は、LayoutInflaterオブジェクトを構築し、inflate()メソッドを呼び出してレイアウトを動的にロードすることができる.inflate()メソッドには3つのパラメータがあり、1つ目のパラメータは埋め込むレイアウトのid、2つ目は親レイアウト、3つ目は親レイアウトにレイアウトを追加してからViewに戻るかどうかです.3番目のパラメータを省略するとデフォルトはtrueです.inflate()メソッド3番目のパラメータattachToRootがtrueの場合、その1番目のパラメータのlayoutファイルが2番目のパラメータで指定されたViewGroupに埋め込まれ、添付されます.メソッドは結合後のViewを返し、ルート要素は2番目のパラメータView Groupです.falseの場合、最初のパラメータで指定したlayoutファイルが埋め込まれ、Viewとして返されます.このViewのルート要素はlayoutファイルのルート要素です.trueでもfalseでも、layoutファイルを正しく測定し、配置するためにViewGroupのLayoutParamsが必要です.
作者:スコットアンリンク:http://www.jianshu.com/p/41796f541e67出典:簡書の著作権は作者の所有である.
いずれにしても、このようにしてViewにレイアウトをロードします.
次に、どのようにAdapterをカスタマイズするかを説明します.例えば、ListViewで果物の画像+名前のリストを表示します.
/*   Adapter                 */

public class Fruit {

  private String name;
  private int imageId;

  public Fruit(String name, int imagId) {
    this.name = name;
    this.imageId = imageId;
  }

  //           getter setter  
  ...
}
/*     Adapter      ArrayAdapter,        */

public class FruitAdapter extends ArrayAdapter<Fruit> {

  //resourceId          id,    getView()        View    
  private int resourceId;

  //         textViewResourceId        ArrayAdapter       TextView 
  //                     id
  public FruitAdapter(Context context, int textViewResourceId, List objects) {
    super(context, textViewResourceId, objects);
    resourceId = textViewResourceId;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
    // View        
    TextView fruitName = (TextView) view.findViewById(R.id.name);
    ImagView fruitImage = (ImageView) view.findViewById(R.id.image)
    //getItem()      ArrayAdapter      ,             
    Fruit fruit = getItem(position);
    fruitName.setText(fruit.getName());
    fruitImage.setImageResource(fruit.getImageId);
    return view;
  }
}

カスタムアダプターはこのようになっているので、問題ないでしょうが、使うとArrayAdapterの使い方と似ていればいいのです.
次にListViewのパフォーマンスを最適化する方法を学びます.
まず、サブアイテムがスクリーンを恐れるたびにgetView()メソッドが呼び出されるため、レイアウトが再ロードされ、ListViewが急速にスクロールするとパフォーマンスが低下します.
AdapterのgetView()メソッドをよく見ると、2番目のパラメータconvertViewは使用されていません.このパラメータは、前にロードされたレイアウトをキャッシュするために使用されています.上記の例のgetView()の内容を修正します.
@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if (convertView == null) {
      view = = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
    } else {
      view = convertView;
    }
    ...
  }
}

次に、getView()メソッドでは、毎回findViewById()が呼び出されてコントロールインスタンスが取得されるので、ViewHolderを使用して最適化することができます.
@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    Fruit fruit = getItem(position);
    View view;
    ViewHolder viewHolder;
    if (convertView == null) {
      view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
      viewHolder = new ViewHolder();
      viewHolder.image = (ImageView) view.findViewById(R.id.iamge);
      viewHolder.name = (TextView) view.findViewById(R.id.name);
      //  View setTag()  ,        View      ,    View getTag()      
      view.setTag(viewHolder);
    } else {
      view = convertView;
      viewHolder = (ViewHolder) view.getTag();
    }
    viewHolder.name.setText(fruit.getName());
    viewHolder.image.setImageResource(fruit.getImageId());
    return view;
  }
}

class ViewHolder {
  ImageView image;
  TextView name;
}

これでListViewの性能はとても良いです.
ListViewの各サブアイテムはクリック可能であり,クリックイベントを登録する方法を学習する.
ListView listView = (ListView) findViewById(R.id.list_View);
listView.setAdapter(adapter);
lsitView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView> parent, View view, int position, long id) {
    Fruit fruit = fruitList.get(position);
    Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
  }
});

実はButtonやTextViewなどのリスナーとは差が少ないので、ちょっと通ればいいのです.
ListViewの勉強はここまでです.初めてブログを書いたので、何か間違いがあったら批判して指摘してください.
主な参考文献:郭霖『第1行コード(第2版)』