2017-04-26 57 views
-2

我在我的recyclerview中的每個視圖中都有togglebuttons,並且在我的Sqlite數據庫中設置了一個數據,當我退出應用程序以在開始時恢復它時,該數據庫會給出ToggleButton的狀態。它工作正常:當我檢查ToggleButton,離開應用程序並重新啓動它,ToggleButton具有與我離開應用程序時相同的狀態。但問題是:當我檢查ToggleButton時,向上滾動視圖,向上滾動後,不再檢查ToggleButton 但是如果我退出應用程序並返回,它會被檢查。如何在我滾動時保存ToggleButton的狀態?如何在recyclerview中滾動時保存togglebutton的狀態?

我在我的onBindViewHolder代碼:

holder.state.setText(item.getState()); 
    holder.toggle.setChecked(false); 

    if(holder.state.getText().toString().equals("yes")) { 
     holder.toggle.setChecked(true); 
     holder.toggle.setBackgroundResource(R.drawable.trianglegreenup); 
     marks_string = holder.marks.getText().toString(); 
     marksint = Integer.valueOf(marks_string); 
     marksint--; 
     marks_string = String.valueOf(marksint); 
     myDb.updateData(holder.id.getText().toString(), marks_string); 
     holder.marks.setText(marks_string); 
     } else { 
      holder.toggle.setChecked(false); 
     } 

國務正好與默認值SQLite數據庫的字符串:在MyViewHolder 「不」

我的代碼:

toggle =((ToggleButton) itemView.findViewById(R.id.toggleButton)); 
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){ 

       if (isChecked){ 
        if(toggledown.isChecked()) { 
         toggledown.setChecked(false); 
         toggle.setChecked(false); 
         toggledown.setBackgroundResource(R.drawable.triangleblackdown); 
         myDb.updateData2(id.getText().toString(), "no"); 
        } else { 
         toggle.setBackgroundResource(R.drawable.trianglegreenup); 
         marks_string = marks.getText().toString(); 
         marksint = Integer.valueOf(marks_string); 
         marksint++; 
         marks_string = String.valueOf(marksint); 
         myDb.updateData(id.getText().toString(), marks_string); 
         marks.setText(marks_string); 
         myDb.updateData2(id.getText().toString(), "yes"); 
         state.setText("yes"); 
        } 
       } else { 
        toggle.setBackgroundResource(R.drawable.triangleblackup); 
        marks_string = marks.getText().toString(); 
        marksint = Integer.valueOf(marks_string); 
        marksint--; 
        marks_string = String.valueOf(marksint); 
        myDb.updateData(id.getText().toString(), marks_string); 
        marks.setText(marks_string); 
        myDb.updateData2(id.getText().toString(), "no"); 
        state_.setText("no"); 
       } 
      } 
     }); 

在哪裏「ToggleDown」是Toggle的對面ToggleButton。

謝謝!

+0

你必須調用Adapter.notifyDataSetChanged(); –

+0

@AbdulKawee好的,但在哪裏以及如何?我不明白它是如何工作的 –

回答

0

假設您已經來回滾動,並且相當合理,您的ViewHolder正在被重用。 現在讓我們來分析您onBindViewHolder()

holder.toggle.setChecked(false); // This will result in `onCheckedChanged()` to be called 

if(holder.state.getText().toString().equals("yes")) { 
    holder.toggle.setChecked(true); // This will result in `onCheckedChanged()` to be called 
    // some code here 
} else { 
    holder.toggle.setChecked(false); // This will result in `onCheckedChanged()` to be called 
} 

所以,你無意中調用至少兩次您ViewHolderonCheckedChanged()方法。 ViewHolder正在被重用,當你第一次創建它時,你附加了一個CheckedChangeListener並且沒有分離它。

爲了刪除監聽器,你必須知道,當一個ViewHolder實際上被回收,這正是onViewRecycler(ViewHolder)告訴你:

@Override 
public void onViewRecycled(final RecyclerView.ViewHolder holder) { 
    holder.toggle.setOnCheckedChangeListener(null); 
    super.onViewRecycled(holder); 
} 
+0

謝謝,但我不知道在哪裏我需要把onViewRecycler(ViewHolder)? –

+0

在回收站視圖的適配器中。請參閱[文檔](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onViewRecycled(VH))。 – azizbekian

+0

它給了我一個錯誤:錯誤:(49,21)錯誤:名稱衝突:AdapterWomen中的名稱衝突:onViewRecycled(ViewHolder)和Adapter中的onViewRecycled(VH)具有相同的擦除,但都不會覆蓋其中的VH是類型變量的其他 : VH擴展在類Adapter中聲明的ViewHolder –

0

我想你沒有更新,當您檢查開關模型。你只是更新數據庫。更新您的模型,您的代碼將按預期工作。

+0

是的,但我不完全知道如何更新它?您的oncheckChangedListener中的 –

+0

:items.get(holder.getAdapterPosition())。setState(isChecked?「yes」:「no」); –

+0

感謝您的幫助,但是當我將此代碼解決方法無法解決時,爲什麼? –