ListView回收视图导致问题

时间:2013-12-16 11:17:42

标签: android listview

单击列表项时,也会选择每12个项目。 ListViews循环视图,因此正在选择许多项目,任何想法我如何克服这个问题,所以我点击的项目被标记为已选中。

@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。名称是一个大约1000个选项的String []。

adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_multiple_choice, names);
setListAdapter(adapter);

2 个答案:

答案 0 :(得分:1)

在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);
}

在适配器中:

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);
        }
    }

});

现在就是这样,每当你想要遍历hasmap找到所选项目时,确保你在完成工作时清除它,否则你将一次又一次地堆积选定的位置。

答案 1 :(得分:1)

正如此回答CheckBox in ListView所说,维护已检查项目的列表,然后根据该列表检查CheckBox中的getView

在检查之前设置onCheckedChangeListener CheckBox的{​​{1}},否则将调用相应的侦听器。