簡體   English   中英

滾動后未選中ListView Adapter中的Android Checkbox

[英]Android Checkbox in ListView Adapter getting unchecked after scrolling

我有一個帶有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; 
    }   
}

如果您閱讀有關如何回收ListView的鏈接 ,即回收機制,那么您應該能夠理解為什么未選中復選框的原因。

給出了有關ListView的相當詳細的解釋。

關鍵點:

  • 當您平移時,ListView會回收不可見的視圖,即Android源代碼中稱為“ ScrapViews”的視圖。
  • ListView使用視圖回收器在滾動時在屏幕外移動時,在當前視口的上方或下方不斷添加回收的視圖,並將活動視圖移動到可回收的池中。

嘗試使用哈希圖維護復選框的狀態,因為當列表視圖滾動時,列表視圖會回收相同的視圖

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

可能有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM