2013-07-15 64 views
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); 
    } 

} 

回答

1

在我看來創建自定義適配器是簡單的,但如果你想保持它這樣試試這個

@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); 
     } 
     else { 
      view.setVisibility(View.GONE); 
     } 

     return true; 
    } 

    return false; 
} 
+0

感謝您的建議,它的工作原理。在Contacts.java中,我添加了一行'mAdapter.notifyDataSetChanged()'來立即查看更改。我也不認爲爲CursorAdapter創建自定義實現在這種情況下是很好的設計。如果你知道我的意思,不喜歡有許多不可重用的本質。 :D – cheshie

+0

很高興有幫助。至於關於自定義適配器,如果你喜歡這種方式去用它。我更喜歡編寫自己的適配器,因爲它將我列表的視圖邏輯保存在單獨的文件中,並使活動類代碼更加清晰。只有在我的列表元素可能具有不同視圖的情況下。 – Gustek

+0

好了,我不知道這是否是正確的,「Android的方式」,但我更喜歡使用的內置插件,直到結束。因爲我是新手,你能否告知我是否正確?我的意思是,如果它是好的設計或沒有。如果框架提供了某些東西,我爲什麼要重寫它,爲什麼要重新發明輪子? – cheshie