Android ListView回收导致问题的视图

Android ListView回收导致问题的视图,android,listview,Android,Listview,当我单击一个列表项时,每个第12项都会被选中。ListView循环使用视图,因此选择了许多项,您知道我如何克服这个问题,以便只将我单击的项标记为选中 @Override public void onListItemClick(ListView l, View v, int position, long id){ CheckedTextView check = (CheckedTextView) v; if (check.isChecked()){ check.

当我单击一个列表项时,每个第12项都会被选中。ListView循环使用视图,因此选择了许多项,您知道我如何克服这个问题,以便只将我单击的项标记为选中

@Override
public void onListItemClick(ListView l, View v, int position, long id){

    CheckedTextView check = (CheckedTextView) v;

    if (check.isChecked()){
        check.setChecked(false);
        selections.remove((Integer) position);
    }
    else{
        check.setChecked(true);
        selections.add((Integer) position);
    }
}
我使用ArrayAdapter。Names是一个包含大约1000个选项的字符串[]

adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_multiple_choice, names);
setListAdapter(adapter);
adapter=newarrayadapter(getActivity(),android.R.layout.simple\u list\u item\u多项选择,名称);
setListAdapter(适配器);

在lisview中,回收是一个非常棘手的概念,首先,回收视图android表示以前使用过的视图,因此基本上此视图将包含您或用户先前设置的所有参数

该视图现在返回到您的适配器,您要做的是检查它是否为null膨胀一个新视图设置新值并将其提供回来,如果不是,则用新值刷新窗口小部件视图,然后将其提供回来

现在回到您的代码,您只需检查此视图是否被选中,假设您选中了列表中的第一个视图,现在当您进一步向下滚动时,此相同视图将通过循环返回给您,并猜测将再次检查什么,请记住这是您使用的第一个视图,这就是创建未选中视图时出现问题的原因

现在,按照您的解决方案,在全局某个位置维护一个单独的列表,以保存选中的索引,并且在将其发送到列表之前,只需从适配器中选中或取消选中复选框,这取决于其在维护的列表中的索引存在。这将解决您的问题

请试试这样的

--在您的主要活动上有一个静态HashMap

--在活动上实现两种方法:AddSelection和RemoveSelection

--在适配器上,实现onCheckedStateChanged侦听器,并根据列表中的位置从映射中执行添加或删除操作

在您的活动中:

  private static HashMap<Integer,Integer> selectedPositions = new HashMap<Integer,Integer>();
    public static boolean isSelected(int position){
        System.out.println("#### Position: " + position + " Value: " + selectedPositions.containsKey(position));
        return selectedPositions.containsKey(position);
    }

    public static void addSelection(int position){
        System.out.println("#### Puttin Position: " + position);
        selectedPositions.put(position,position);
    }

public static void removeSelection(int position){
    System.out.println("#### Removing Position: " + position);
    selectedPositions.remove(position);
}
现在就是这样,无论何时,只要您想通过hasmap查找所选项目,请确保在完成任务后清除它,否则你将一次又一次地堆积所选的位置。

正如这个答案所说,维护一个选中项目的列表,然后根据该列表在
getView
中选中你的
复选框


在选中之前,也要为该
复选框设置
onCheckedChangeListener
null
,否则会调用相应的侦听器。

您能发布一些示例伪代码,以便我能准确理解您的意思吗
checkbox.setChecked(MainActivity.isSelected(position));

checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){

    @Override
    public void onCheckedChanged(CompoundButton view, boolean state) {
        // TODO Auto-generated method stub
        if(state == true){
            MainActivity.addSelection(position);
        }else{
            MainActivity.removeSelection(position);
        }
    }

});