アクティビティに ListView があります。ListView のデータは、SimpleCursorAdapter を使用して連絡先から取り込まれます。ListView の行のレイアウトは、人の名前と番号を表す 2 つの TextView と、可視性が非表示に設定されている ImageView です。
ImageView を表示するかどうかをチェックするアダプター用のカスタム ViewBinder があります。問題は、画像がランダムに表示されることです。問題は、SimleCursorAdapter の実装が newView と bindView で使用する ViewHolder パターンにあると思います。
カスタムカーソルアダプターを書かずに問題を解決できますか?
以下のソース:
list_row.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/contact_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="10dp"
android:drawableLeft="@drawable/directory_pushed"
android:drawablePadding="10dp"
android:text="contact name" />
<TextView
android:id="@+id/contact_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/contact_name"
android:text="093797888" />
<ImageView
android:id="@+id/selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:src="@drawable/icon_phone"
android:visibility="gone" />
</RelativeLayout>
Contacts.java
public class Contacts extends Activity implements
AdapterView.OnItemClickListener, ViewBinder {
private ListView mContactList;
private SimpleCursorAdapter mAdapter;
private List<String> contacts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts);
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[] { Phone._ID, Phone.DISPLAY_NAME,
Phone.NUMBER };
String selection = Phone.TYPE + "=?";
String[] selectionArgs = new String[] { String
.valueOf(Phone.TYPE_MOBILE) };
String sortOrder = Phone.DISPLAY_NAME + " ASC";
contacts = LoginInfo.getContacts(this);
Cursor managedCursor = getContentResolver().query(uri, projection,
selection, selectionArgs, sortOrder);
mContactList = (ListView) findViewById(R.id.contacts_list);
mAdapter = new SimpleCursorAdapter(this, R.layout.contacts_row,
managedCursor, new String[] { Phone.DISPLAY_NAME, Phone.NUMBER,
Phone.NUMBER }, new int[] { R.id.contact_name,
R.id.contact_number, R.id.selected }, 0);
mAdapter.setViewBinder(this);
mContactList.setOnItemClickListener(this);
mContactList.setAdapter(mAdapter);
}
@Override
protected void onPause() {
super.onPause();
LoginInfo info = LoginInfo.getLoginInfo(this);
info.contacts = null;
info.contacts = contacts;
LoginInfo.updateCache(this, info);
}
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if (view.getId() == R.id.selected) {
String number = cursor.getString(columnIndex);
if (isSelected(number)) {
view.setVisibility(View.VISIBLE);
}
return true;
}
return false;
}
private boolean isSelected(String number) {
int index = contacts.indexOf(number);
return !(index == -1);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Cursor c = (Cursor) mAdapter.getItem(position);
String number = c.getString(c.getColumnIndex(Phone.NUMBER));
contacts.add(number);
}
}