Android ListView, Object reuse example
안드로이드에서 ListView를 사용할 때 객체를 재활용하여 성능을 올리고 메모리 사용을 낮추는 예
객체를 재활용할 때 부주의하면 발생할 수 있는 현상을 확인해본다. ListView를 위 아래로 스크롤할 때 선택된 체크박스의 위치가 불규칙하게 변경되는 문제를 확인할 수 있다. 이 문제를 해결한 예는 여기를 참조하세요
layout/main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#cccccc" android:text="" /> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
layout/row.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" /> <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CheckBox" /> </LinearLayout>
TestActivity.java
package com.example.androidapp; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class TestActivity extends Activity implements OnItemClickListener { String [] name = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; ArrayAdapter<String> adapter; TextView tv; ListView listView; public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); adapter = new MyAdapter ( this, R.layout.row, R.id.textView1, name); listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter); listView.setOnItemClickListener(this); tv = (TextView) findViewById(R.id.textView1); } public void onItemClick(AdapterView<?> parent, View v, int position, long id) { TextView tv = (TextView) v.findViewById(R.id.textView1); String name = tv.getText().toString(); this.tv.setText(name); } }
MyAdapter.java
package com.example.androidapp; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends ArrayAdapter<String> { Context context; public MyAdapter(Context context, int textViewResourceId, String[] objects) { super(context, textViewResourceId, objects); this.context = context; } public MyAdapter(Context context, int resource, int textViewResourceId, String[] objects) { super(context, resource, textViewResourceId, objects); this.context = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if(view==null) { Activity ctx = (Activity) this.context; LayoutInflater inflater =ctx.getLayoutInflater(); view = inflater.inflate(R.layout.row, null); } ImageView iv = (ImageView) view.findViewById(R.id.imageView1); TextView tv = (TextView) view.findViewById(R.id.textView1); CheckBox cb = (CheckBox) view.findViewById(R.id.checkBox1);
tv = (TextView) findViewById(R.id.textView1); return view; } }