2012-02-24 53 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; 
} 

我相信其他一切都应该从教程中修改。