滚动后未选中 ListView 适配器中的 Android 复选框

Posted

技术标签:

【中文标题】滚动后未选中 ListView 适配器中的 Android 复选框【英文标题】:Android Checkbox in ListView Adapter getting unchecked after scrolling 【发布时间】:2015-08-23 15:10:30 【问题描述】:

我有一个带有 ImageView、TextView 和 CheckBox 的自定义 ListViewAdapter。

当我选择特定的复选框并向下滚动时,向后滚动后,复选框将被取消选中。 我尝试了几个答案,但似乎没有任何效果。

这是我的代码:

public class ListViewAdapterDrawer extends ArrayAdapter<String> 

    ImageView imageViewSensor;
    TextView textViewSensor, textViewLogging;
    CheckBox checkBoxSensor;
    private boolean[] itemChecked;
    int count;

    public ListViewAdapterDrawer(Context context, String[] sensorArray) 
        super(context, R.layout.adapter_listview_drawer, sensorArray);
        itemChecked = new boolean[sensorArray.length];
        for (int i = 0; i < this.getCount(); i++) 
            itemChecked[i] = false;
        
      

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

        if (convertView == null) 
            LayoutInflater inflater = LayoutInflater.from(getContext());

            convertView = inflater.inflate(R.layout.adapter_listview_drawer, parent, false);    
        
        imageViewSensor = (ImageView) convertView.findViewById(R.id.imageViewSensor);
        textViewSensor = (TextView) convertView.findViewById(R.id.textViewSensor);
        checkBoxSensor = (CheckBox) convertView.findViewById(R.id.checkBoxSensor);

        checkBoxSensor.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                if (checkBoxSensor.isChecked())
                    itemChecked[position] = true;
                else 
                    itemChecked[position] = false;
                
            
        );

        checkBoxSensor.setChecked(itemChecked[position]);               
        return convertView; 
       

【问题讨论】:

【参考方案1】:

如果您阅读此link 关于 ListView 如何被回收,即回收机制,您应该能够理解为什么您的复选框未被选中。

This对ListView做了比较详细的解释。

要点:

ListView 在您平移时回收不可见的视图(在 android 的源代码中称为“ScrapViews”)。 ListView 使用视图回收器不断在当前视口下方或上方添加回收视图,并在活动视图在滚动时移出屏幕时将它们移动到可回收池中。

【讨论】:

【参考方案2】:

尝试使用hashmap来维护checkbox的状态,因为listview在滚动时会回收同一个view

  HashMap<Integer, CoreQuestion.SubSection> selectionMap = new HashMap<>();

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

        if (convertView == null) 
            LayoutInflater inflater = LayoutInflater.from(getContext());

            convertView = inflater.inflate(R.layout.adapter_listview_drawer, parent, false);    
        
        imageViewSensor = (ImageView) convertView.findViewById(R.id.imageViewSensor);
        textViewSensor = (TextView) convertView.findViewById(R.id.textViewSensor);
        checkBoxSensor = (CheckBox) convertView.findViewById(R.id.checkBoxSensor);

        checkBoxSensor.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                if (checkBoxSensor.isChecked())
                    itemChecked[position] = true;
                     selectionMap.put(position,"true")
                else 
                    itemChecked[position] = false;
                     selectionMap.put(position,"false")
                

            
        );
       if(selectionMap.get(posotion)!=null)
       
              checkBoxSensor.setChecked(itemChecked[position]);

                    
        return convertView; 
       

希望对您有所帮助。

【讨论】:

以上是关于滚动后未选中 ListView 适配器中的 Android 复选框的主要内容,如果未能解决你的问题,请参考以下文章

listview滚动到底部

自定义 ListView 中的滚动滞后

滚动 Listview 中的文本值时正在更改

如何解决ListView与CheckBox的冲突问题

滚动视图中的 Android 列表视图

如何更新 Listview 中的特定行