2017-07-26 64 views
0

每當上下滾動時,我都會丟失複選框的檢查狀態。Android滾動後丟失檢查狀態

我解決不了這個問題,兩天......

請幫我

這裏是我的代碼。

public View getView(final int position, View view, ViewGroup parent) { 

    context = parent.getContext(); 

    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    if (view == null) { 

     holder = new ViewHolder(); 

     view = inflater.inflate(R.layout.custom_llistview, parent, false); 

     holder.img_view = (ImageView) view.findViewById(R.id.custom_imageView); 
     holder.txt_view = (TextView) view.findViewById(R.id.custom_textView); 
     holder.checkbox = (CheckBox) view.findViewById(R.id.check_box); 

     view.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)view.getTag(); 

    } 

    holder.checkbox.setChecked(check_flag_arr[position]); 

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 

       check_flag_arr[position] = isChecked; 
      else { 
       check_flag_arr[position] = isChecked; 
      } 
     } 
    }); 

    file_path = list_item.get(position).getFile_path(); 
    Bitmap showImage = BitmapFactory.decodeFile(file_path); 

    holder.img_view.setImageBitmap(showImage); 

    list_contents = file_path.substring(45, 65); 
    holder.txt_view.setText(list_contents); 

    return view; 
} 

和細節的解釋將是一大樂事給我。

我必須解決這個問題。

感謝您收看我的文章。

+0

你如果和別人都在做同樣的事情。所以它變得多餘。這不是你問題的原因,只是想讓你知道。 if(isChecked){ check_flag_arr [position] = isChecked;其他{ 其中{check_flag_arr [position] = isChecked; } –

+0

感謝您的意見。但我已經知道了。這是爲了我的可讀性。我原來的代碼分別在if和else中有不同的語句。 –

+0

@ Na Jun Yeop查看下面的答案。這應該適合你 –

回答

1

滾動時,setOnCheckedChangeListener被調用。因此,要處理,在獲取視圖,你需要做以下 -

holder.checkbox.setOnCheckedChangeListener(null); 
holder.checkbox.setChecked(_songs.get(position).isSelected()); 

您首先需要設置onchecked空以便在滾動時得到填充視圖,您要分配的意見,你不叫onCheckedListener 。

然後你需要調用OnCheckedChangeListener

holder.checkbox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (holder.checkbox.isChecked()) { 
        check_flag_arr[position] = true; 
       } else { 
        check_flag_arr[position] = false; 
       } 
      } 
     }); 
+0

謝謝,但它不起作用。我先在onClickListener上設置null,然後設置校驗值。之後,我打電話給setOnClickListener。我做對了嗎? –

+0

我無法理解機制。每次調用onClickListener時,我都會存儲檢查值。然後,當再次調用getView時,我將檢查值設置爲之前存儲的值。什麼不對? –

+0

我解決了!!!!!!!!!!!!!!!!!非常感謝。如果我沒有設置OncheckedChangedListener爲null,那麼下一個回收的視圖會獲得以前的檢查值?這是設置null的原因嗎? –

2

每當你滾動setOnCheckedChangeListener被調用。

刪除setOnCheckedChangeListener並實現setOnClickListener

holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (holder.checkbox.isChecked()) { 
         check_flag_arr[position] = true; 
        } else { 
         check_flag_arr[position] = false; 
        } 
       } 
      }); 
+0

改變更好!謝謝,但它不能正常工作。問題是什麼?? –