安卓将SimpleAdapter与setOnItemClick一起使用时,单击包含复选框的Listview

安卓将SimpleAdapter与setOnItemClick一起使用时,单击包含复选框的Listview,listview,checkbox,onitemclicklistener,simpleadapter,Listview,Checkbox,Onitemclicklistener,Simpleadapter,我在由SimpleAdapter填充的活动(不是ListActivity)中有一个ListView public void updateGroupsInfoPane(){ final ListView m_listview3 = (ListView) findViewById(R.id.memberOfList); mapMemberOfList.clear(); for (String group : arrayAccountMemberOfList) {

我在由SimpleAdapter填充的活动(不是ListActivity)中有一个ListView

public void updateGroupsInfoPane(){
    final ListView m_listview3 = (ListView) findViewById(R.id.memberOfList);
    mapMemberOfList.clear();
    for (String group : arrayAccountMemberOfList) {
        Map<String, Object> datum = new HashMap<String, Object>(2);
        String[] tempString = group.split(",");
        datum.put("groupname", tempString[0]);
        datum.put("groupdesc", tempString[1]);
        mapMemberOfList.add(datum);
    }
    SimpleAdapter adapter = new SimpleAdapter(this, mapMemberOfList, R.layout.membersof_list, new String[] {"groupname", "groupdesc"}, new int[] {android.R.id.text1, android.R.id.text2});
    m_listview3.setAdapter(adapter);

    m_listview3.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE);
    m_listview3.setTextFilterEnabled(true);

    m_listview3.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            CheckBox box = (CheckBox) view.findViewById(R.id.checkbox);
            TextView text1 = (TextView) view.findViewById(android.R.id.text1);
            String tempString = text1.getText().toString();

            if (box.isChecked()){
                box.setChecked(false);
                listCurrentMembership.remove(tempString);
            }else{
                box.setChecked(true);
                listCurrentMembership.add(tempString);
            };
        }
    });
}
public void updateGroupsInfoPane(){
最终ListView m_listview3=(ListView)findViewById(R.id.memberOfList);
mapMemberOfList.clear();
for(字符串组:arrayAccountMemberOfList){
地图基准=新的HashMap(2);
String[]tempString=group.split(“,”);
datum.put(“groupname”,tempString[0]);
datum.put(“groupdesc”,tempString[1]);
mapMemberOfList.add(基准面);
}
SimpleAdapter=new SimpleAdapter(此,mapMemberOfList,R.layout.MemberSofU列表,新字符串[]{“groupname”,“groupdesc”},新int[]{android.R.id.text1,android.R.id.text2});
m_listview3.setAdapter(适配器);
m_listview3.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE);
m_listview3.setTextFilterEnabled(true);
m_listview3.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
复选框=(复选框)view.findViewById(R.id.CheckBox);
TextView text1=(TextView)view.findViewById(android.R.id.text1);
字符串tempString=text1.getText().toString();
if(box.isChecked()){
框。setChecked(false);
listCurrentMembership.remove(tempString);
}否则{
box.setChecked(true);
listCurrentMembership.add(tempString);
};
}
});
}
这个很好用。问题是,当我滚动此列表时,复选框会离开屏幕,不再重新检查正确的复选框,然后选中下一个滚动上的项目。当我将数据加载到另一个数组中时,数据是正确的。只是复选框图形是错误的。如果不滚动,检查和取消检查会添加和删除正确的数据

搜索这个是因为回收ListView,我需要实现一个getView

我已经看了不少关于如何使用SimpleAdapter实现这一点的示例,因为有些帖子说SimpleAdapter已经实现了getView,还有一些示例使用了ListActivity。那么我是如何通过点击ListView项来检查复选框的,而不是复选框本身可能与此有关?但我找不到一个类似于我正在做的事情的例子,这样我就可以到处玩并解决这个问题

ListView“MembersOfU列表”中项目的我的XML为:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vw1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<CheckBox android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:focusable="false"
android:clickable="false"
android:checked="false" />

<LinearLayout
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >

    <TextView android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
        android:layout_marginTop="8dip"
        android:ellipsize="end"
        android:textSize="8sp"
        android:textStyle="bold"
        android:singleLine="true"
    />
</LinearLayout>
<LinearLayout
    android:id="@+id/ll2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_below="@+id/ll1"
    >

    <TextView android:id="@android:id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
        android:ellipsize="end"
        android:textSize="6sp"
        android:singleLine="true"
    />
</LinearLayout>

我只有一个数据数组,我清空了与ListView关联的数组,因为我确实需要在加载新的/不同的数据之前清除它,我在逗号处拆分数据,将其加载到groupname和groupdesc中。默认情况下,所有复选框都处于未选中状态,这是应该的

我是Android编程新手,我知道它不是最干净或最有效的代码,但一旦它起作用,我计划重新研究它,使它更好

任何建议、链接和示例都是有价值的。谢谢