0
我在活動中有一個ListView。 ListView的數據從使用SimpleCursorAdapter的聯繫人填充。 ListView行的佈局是兩個代表人名和編號的TextView,以及一個可見性設置爲不可見的ImageView。simplecursoradapter隨機發布視圖
我有一個適配器,用來檢查是否ImageView的應該是可見或不可見的自定義ViewBinder。問題是圖像是隨機可見的。我猜問題是在ViewHolder模式下SimleCursorAdapter的實現與newView和bindView一起使用。
我可以解決問題而無需編寫自定義遊標適配器嗎?下面
來源:
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);
}
}
感謝您的建議,它的工作原理。在Contacts.java中,我添加了一行'mAdapter.notifyDataSetChanged()'來立即查看更改。我也不認爲爲CursorAdapter創建自定義實現在這種情況下是很好的設計。如果你知道我的意思,不喜歡有許多不可重用的本質。 :D – cheshie
很高興有幫助。至於關於自定義適配器,如果你喜歡這種方式去用它。我更喜歡編寫自己的適配器,因爲它將我列表的視圖邏輯保存在單獨的文件中,並使活動類代碼更加清晰。只有在我的列表元素可能具有不同視圖的情況下。 – Gustek
好了,我不知道這是否是正確的,「Android的方式」,但我更喜歡使用的內置插件,直到結束。因爲我是新手,你能否告知我是否正確?我的意思是,如果它是好的設計或沒有。如果框架提供了某些東西,我爲什麼要重寫它,爲什麼要重新發明輪子? – cheshie