0

アクティビティに 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);
    }

}
4

1 に答える 1