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のコンストラクション関数には、
Androidは多くのアダプタの実装クラスを提供しています.ここでは、テキストタイプのデータを転送するなど、汎用的に適切なデータを指定するArrayAdapterを見てみましょう.
Adapterには
どうやって縛るの?次の例を見てみましょう.
ここでは
作者:スコットアンリンク:http://www.jianshu.com/p/41796f541e67出典:簡書の著作権は作者の所有である.
いずれにしても、このようにしてViewにレイアウトをロードします.
次に、どのようにAdapterをカスタマイズするかを説明します.例えば、ListViewで果物の画像+名前のリストを表示します.
カスタムアダプターはこのようになっているので、問題ないでしょうが、使うとArrayAdapterの使い方と似ていればいいのです.
次にListViewのパフォーマンスを最適化する方法を学びます.
まず、サブアイテムがスクリーンを恐れるたびに
Adapterの
次に、
これでListViewの性能はとても良いです.
ListViewの各サブアイテムはクリック可能であり,クリックイベントを登録する方法を学習する.
実はButtonやTextViewなどのリスナーとは差が少ないので、ちょっと通ればいいのです.
ListViewの勉強はここまでです.初めてブログを書いたので、何か間違いがあったら批判して指摘してください.
主な参考文献:郭霖『第1行コード(第2版)』
概要: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版)』