Android listView 使用checkbox 錯(cuò)亂問題

這個(gè)是使用ViewHolder常見的問題

 @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        info = list.get(i);
        ViewHolder viewHolder;
        if(view==null) {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(getContext()).inflate(itemId, null);
            viewHolder.imageView = view.findViewById(R.id.app_icon);
            viewHolder.textView =  view.findViewById(R.id.app_packagename);
            viewHolder.checkBox =  view.findViewById(R.id.app_chechbox);
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
        }
        if(checkingArray[i]==true){
            viewHolder.checkBox.setChecked(true);
            Log.d("click"+i+"", " set checkbox true");
        }else{
            viewHolder.checkBox.setChecked(false);
        }

        viewHolder.imageView.setImageDrawable(info.icon);
        viewHolder.textView.setText(info.packageName);
        final int a =i;
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                Log.d("check"+a, "onCheckedChanged: ");
                if (b) {
                    App.bannedApplicationList.add(info.packageName);
                   // info.ifChecked  = true;
                    checkingArray[a] = true;
                    Log.d("click"+a, "set true");
                }else{
                   // info.ifChecked = false;
                   // Log.d("listLength",App.bannedApplicationList.size()+"");
                }
            }
        });
        int length = checkingArray.length;
        for(int k=0;k<length;k++){
            if(checkingArray[k]==false){
                
            }
        }
        return view;
    }

只放出getView部分的代碼
首先需要記一下點(diǎn)擊checkbox時(shí)候的狀態(tài),這個(gè)狀態(tài)的可以在List的實(shí)體類中添加一個(gè)布爾變量記錄,那么判斷這view的時(shí)候,如果true的話在set一下就可以。

但是經(jīng)過(guò)觀察:
在點(diǎn)擊前面四個(gè)checkboxbox時(shí),控制臺(tái)輸出
Log.d("check"+a, "onCheckedChanged: ");
沒有問題,但是在向下滑動(dòng)時(shí)候,會(huì)錯(cuò)誤的認(rèn)為其他的item也被點(diǎn)擊。

這樣,只需要換一個(gè)監(jiān)聽器就行(我還把item也設(shè)置為false)

@Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        info = list.get(i);
        ViewHolder viewHolder;
        if(view==null) {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(getContext()).inflate(itemId, null);
            viewHolder.imageView = view.findViewById(R.id.app_icon);
            viewHolder.textView =  view.findViewById(R.id.app_packagename);
            viewHolder.checkBox =  view.findViewById(R.id.app_chechbox);
            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
        }
        if(checkingArray[i]==true){
            viewHolder.checkBox.setChecked(true);
            Log.d("click"+i+"", " set checkbox true");
        }else{
            viewHolder.checkBox.setChecked(false);
        }

        viewHolder.imageView.setImageDrawable(info.icon);
        viewHolder.textView.setText(info.packageName);
        final int a =i;
        viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkingArray[a] = true;
                Log.d("click"+a, "onClick: ");
            }
        });
        return view;
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容