2017-04-26 1 views
-2

내 recyclerview에서 각보기에 togglebuttons가 있고 시작시 복원 할 때 응용 프로그램을 종료 할 때 ToggleButton의 상태를 알려주는 Sqlite 데이터베이스에 Data를 설정합니다. 잘 작동합니다 : ToggleButton을 체크하고 앱을 종료하고 다시 시작하면 ToggleButton은 앱을 떠날 때와 동일한 상태가됩니다. 하지만 문제는 : ToggleButton을 체크하고 스크롤 아웃 한 후 ToggleButton은 더 이상 을 체크하지 않고을 체크하고 돌아와서 체크하면 체크됩니다. 스크롤 할 때 ToggleButton의 상태를 저장하려면 어떻게해야합니까?recyclerview에서 스크롤 할 때 토글 버튼의 ​​상태를 저장하는 방법은 무엇입니까?

내 onBindViewHolder에 내 코드 :

국가는 기본 값으로 SQLite는 데이터베이스 단지 문자열입니다
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); 
     } 

: MyViewHolder에 "NO"

내 코드 :

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을 다시 사용한다고 가정합니다.

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() 방법을 요구하고있다 : 은 이제 당신의 onBindViewHolder() 분석 할 수 있습니다. 그 ViewHolder은 재사용되고 처음 만들 때 CheckedChangeListener을 첨부하고 분리하지 않았습니다.

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

고마워,하지만 정확히 어디 onViewRecycler (ViewHolder)를 넣어 해야할지 모르겠다? –

+0

리사이더 뷰 어댑터. [docs] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onViewRecycled (VH))를 참조하십시오. – azizbekian

+0

오류 : (49, 21) 오류 : 이름 충돌 : 어댑터에서 onViewRecycled (ViewHolder) 및 어댑터에서 onViewRecycled (VH)는 동일한 지우기를 가지지 만 다른 것은 무시합니다. 여기서 VH는 유형 변수입니다. : VH는 Adapter 클래스에서 선언 된 ViewHolder를 확장합니다. –

0

난 당신이 스위치를 점검하는 모델을 업데이트하지 생각 : 정확히 알려줍니다 onViewRecycler(ViewHolder) 당신이 ViewHolder 실제로 재생 될 때 알아야하는 리스너를 제거하기 위해

. 데이터베이스를 업데이트하는 것입니다. 모델을 업데이트하면 코드가 예상대로 작동합니다.

+0

예. 그렇지만 정확하게 업데이트하는 방법을 모르겠습니다. oncheckChangedListener의 –

+0

: items.get (holder.getAdapterPosition()). setState (isChecked? "yes": "no"); –

+0

도움을 주셔서 감사합니다,하지만이 코드를 넣을 때 방법을 해결할 수 없습니까? –

관련 문제