Android-ListViewの多重化最適化
3748 ワード
私达のふだんの使用の过程の中で、みんながListViewというコントロールを使ったことがあると信じて、例えばqq友达のリスト、电话帳の通信录など.ただし、カスタムListViewをより多く使用しています.ここでは、ListViewコントロールをカスタマイズして開発ニーズを満たす方法について説明します(listviewリストに画像と文字情報を同時に表示させる).
まず、いくつかの果物(文字に対応してプレゼンテーション)に対応する画像をいくつか用意する必要があります.
画像と文字を表示させたいので、ListViewの適合タイプとして、新しいクラスFruitを定義します.コードは以下の通りです.
fruit_item.xml、コードは以下の通りです.
このレイアウトファイルでは、画像を表示するためにImageViewを定義し、文字を表示するためにTextViewを定義します.次に、ArrayAdapterを継承し、汎用型をFruitクラスとして指定し、新しいクラスFruit Adapterを作成します.listViewの稼働効率を向上させるために、カスタム内部クラスViewHolderを直接使用してコードを完了します.コードは次のとおりです.
FruitAdapterは、コンテキスト、ListViewサブアイテムレイアウトのidおよびデータを転送するための親クラスの構造関数のセットを書き換え、getViewメソッドを書き換え、各サブアイテムが画面内にスクロールされたときに呼び出される.getViewメソッドでは、まずgetItem()メソッドで現在のアイテムのFruitのインスタンスを取得し、LayoutInflaterを使用してこのサブアイテムに入力したレイアウトをロードし、次にViewのfindView ById()メソッドを呼び出してImageViewとTextViewのインスタンスを取得し、setImageResource()メソッドとsetText()メソッドをそれぞれ呼び出して表示状況を設定し、最後にレイアウトviewを返してカスタムアダプタを完了します.次のように、MainActivityのコードを補完します.
ここでconvertViewパラメータについて説明すると、後で再利用できるように、以前にロードされたレイアウトをキャッシュできます.
新しい内部クラスViewHolderは、コントロールのインスタンスをキャッシュするために使用されます.convertViewが空の場合、ViewHolderオブジェクトを作成し、コントロールインスタンスをViewHolderに保存します.次にsetTag()メソッドを呼び出し、オブジェクトをViewに格納します.convertViewが空でない場合は、ViewのgetTag()メソッドを呼び出して再取り出し、ListViewの実行効率を最適化することができます.
まず、いくつかの果物(文字に対応してプレゼンテーション)に対応する画像をいくつか用意する必要があります.
画像と文字を表示させたいので、ListViewの適合タイプとして、新しいクラスFruitを定義します.コードは以下の通りです.
public class Fruit {
private String name;
private int imageID;
public Fruit(String name,int imageId) {
this.name=name;
this.imageID=imageId;
}
public String getName() {
return name;
}
public int getImageID() {
return imageID;
}
}
Fruitクラスには2つの属性しかありません.1つはnameが表示する文字を表し、もう1つはimageIDが対応するピクチャリソースを表します.その後、ListViewのサブアイテムにカスタムレイアウトを書き、layoutディレクトリの下で新規作成する必要があります.fruit_item.xml、コードは以下の通りです.
このレイアウトファイルでは、画像を表示するためにImageViewを定義し、文字を表示するためにTextViewを定義します.次に、ArrayAdapterを継承し、汎用型をFruitクラスとして指定し、新しいクラスFruit Adapterを作成します.listViewの稼働効率を向上させるために、カスタム内部クラスViewHolderを直接使用してコードを完了します.コードは次のとおりです.
public class FruitAdapter extends ArrayAdapter{
private int resourceId;
public FruitAdapter(Context context, int resource, List objects) {
super(context, resource, objects);
resource=resourceId;
}
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit=getItem(position);// Fruit
View view;
ViewHolder viewHolder;
if(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder=new ViewHolder();
viewHolder.fruitImage=(ImageView) view.findViewById(R.id.fruit_imae);
viewHolder.fruitName=(TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}else{
view=convertView;
viewHolder=(ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageID());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
//
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
}
FruitAdapterは、コンテキスト、ListViewサブアイテムレイアウトのidおよびデータを転送するための親クラスの構造関数のセットを書き換え、getViewメソッドを書き換え、各サブアイテムが画面内にスクロールされたときに呼び出される.getViewメソッドでは、まずgetItem()メソッドで現在のアイテムのFruitのインスタンスを取得し、LayoutInflaterを使用してこのサブアイテムに入力したレイアウトをロードし、次にViewのfindView ById()メソッドを呼び出してImageViewとTextViewのインスタンスを取得し、setImageResource()メソッドとsetText()メソッドをそれぞれ呼び出して表示状況を設定し、最後にレイアウトviewを返してカスタムアダプタを完了します.次のように、MainActivityのコードを補完します.
public class MainActivity extends Activity {
private List fruitList=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
ListView listView=(ListView)findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
}
ここでconvertViewパラメータについて説明すると、後で再利用できるように、以前にロードされたレイアウトをキャッシュできます.
新しい内部クラスViewHolderは、コントロールのインスタンスをキャッシュするために使用されます.convertViewが空の場合、ViewHolderオブジェクトを作成し、コントロールインスタンスをViewHolderに保存します.次にsetTag()メソッドを呼び出し、オブジェクトをViewに格納します.convertViewが空でない場合は、ViewのgetTag()メソッドを呼び出して再取り出し、ListViewの実行効率を最適化することができます.