2012-02-24 21 views
0

我加載電話聯繫人數據導入到其中有一個TextView和一個CheckBox作爲行一個ListView。手柄回收複選框內的ListView與ResourceCursorAdapter

我面臨的問題是在處理複選框,有一次我在ListView上任何項目的檢查, 它被選中,但是當我向下滾動ListView的項目得到檢查automatically一組新的行,這只是happeing因爲列表視圖回收的東西,但我怎麼能處理這一個複選框

我使用ResourceCursorAdapter和使用bindView和NewView的方法。

我看到他們說來存儲複選框的狀態的線程數,但他們是not for ResourceCursorAdapter,所以如何將這種方法?

到目前爲止,我嘗試以下based on RateListDemo of commonsware

public View getView (final int position, View convertView, ViewGroup parent) { 

    View row = super.getView(position, convertView, parent); 
    ContactListItemCache holder=(ContactListItemCache)row.getTag(); 

    if (holder==null) { 
    holder=new ContactListItemCache(row); 
    row.setTag(holder); 

    /** I really don't know what to set over here **/ 
    CheckBox cbox=(CheckBox)row.findViewById(R.id.contactCheck); 
     cbox.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v) { 


       Log.d("Check check",position+""); 

      } 

     }); 

     /** I really don't know what to set over here too **/ 
     holder.selCheckBox =cbox; 
     holder.selCheckBox.setTag(new Integer(position)); 

    } 
return row; 

} 

這裏是我的ContactListItemCache

final static class ContactListItemCache { 
    public TextView nameView; 
    public QuickContactBadge photoView; 
    public CheckBox selCheckBox; 
    public CharArrayBuffer nameBuffer = new CharArrayBuffer(128); 
    public CharArrayBuffer nameMiddleBuffer = new CharArrayBuffer(128); 
    public CharArrayBuffer nameFamilyBuffer = new CharArrayBuffer(128); 

    /** Following Changes I have Made **/ 
    ContactListItemCache(){} 
    ContactListItemCache(View base){ 

     selCheckBox = (CheckBox)base.findViewById(R.id.contactCheck); 
     } 
} 

回答

0

commonsWare有一個很好的例子來處理這個問題:

RateListDemo

希望這有助於。

+0

我試過用資源適配器但沒有工作 – Hunt 2012-02-25 21:59:04

1

我有一個類似的問題,有解決辦法來了,雖然我不知道這是做的最好的方式。

我跟着這個(相當不錯)系列教程http://www.vogella.de/articles/AndroidListView/article.html#overview_listview 的實施直至幷包括第8章「教程:域模型和行互動」

注意,這不使用ResourceCursorAdapter。

從那裏,我修改了getModel()函數和模型類本身。我改變了getModel()方法返回的從我的數據庫匹配數據模型的列表。以下是一些示例代碼(大部分內容都是通過示例修改從本教程複製的)。注意'//額外數據的例子'評論。這顯示了經過修改以處理更多數據的位置(例如,如果您希望List項目顯示的不僅僅是CheckBox和TextView)。

public class Model { 

    private String name; 
    private int exampleInt; // example of additional data 
    private boolean selected; 

    public Model(String name) { 
     this.name = name; 
     this.exampleInt= 0; 
     selected = false; 
    } 

    public Model(String name, int exampleInt) { 
     this.name = name; 
     this.exampleInt= exampleInt; 
     selected = false; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    // example of additional data 
    public int getExampleInt() { 
     return exampleInt; 
    } 

    public void setExampleInt(int i) { 
     this.exampleInt = i; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

} 

然後,在你的活動,修改getModel()函數來填充與數據庫中的信息列表。我假裝示例數據(exampleInt)在列「exampleint」舉行:

private List<Model> getModel() { 
    //setContentView(R.layout.teamview); 
    datasource.open(); 
    Cursor cursor = datasource.GetCursor(); 

    List<Model> list = new ArrayList<Model>(); 

    while (cursor.moveToNext()) { 
     list.add(get(cursor.getString(cursor.getColumnIndex("name")), 
       cursor.getInt(cursor.getColumnIndex("exampleint")))); // example of additional data 
    } 

    // Initially select one of the items 
    //list.get(1).setSelected(true); 
    datasource.close(); 
    return list; 
} 

你必須修改的get()函數,以及如果你想額外返回一個新的Model實例exampleInt:

private Model get(String name, int example) { 
    return new Model(name, example); 
} 

最後,在arrayadapter(在本教程中它是InteractiveArrayAdapter),改變ViewHolder以匹配您的列表項的佈局。在這個例子中,我假裝它叫做'youritemlayoutxml',並且有一個額外的TextView(R.id.exampleint)來顯示我們的新exampleInt。還要修改getView(...)功能來設置所需信息的視圖:

static class ViewHolder { 
    protected TextView textName; 
    protected TextView textExampleInt; // example of additional data 
    protected CheckBox checkbox; 
} 


public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.youritemlayoutxml, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.textName = (TextView) view.findViewById(R.id.name); 
     viewHolder.textExampleInt= (TextView) view.findViewById(R.id.exampleint); // example of additional data 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkbox1); 
     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         Model element = (Model) viewHolder.checkbox 
           .getTag(); 
         element.setSelected(buttonView.isChecked()); 

        } 
       }); 
     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 
    } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.textName.setText(list.get(position).getName()); 
    holder.textExampleInt.setText(Integer.toString(list.get(position).getExampleInt())); // example of additional data 
    holder.checkbox.setChecked(list.get(position).isSelected()); 
    return view; 
} 

我相信其他一切都應該從教程中修改。