2017-03-06 2 views
2

리사이클러보기와 어댑터 클래스가 있습니다. 보기의 한 목록 셀 안에는 확인란이 있습니다. 검사에 따르면 내보기의 버튼 하나가 활성화/비활성화되어 있습니다. 하지만 제가 발견 한 것은 상자에 하나의 체크를 할 때입니다. 버튼 활성화는 두 번 호출됩니다. 그리고 일부 체크 박스에 대해 단일 선택을 사용합니다 (어댑터 클래스에서 enforcedexclusivity()라는 메서드를 사용하여 조건을 확인했습니다). 따라서 해당 확인란의 경우 선택 취소가 제대로 작동하지만 확인은 3 번 호출됩니다. 나는 아래에 나의 코드를 넣는다. 해결책을 말해주십시오.체크 박스는 한 번의 클릭으로 두 번 확인합니다.

public class FurtherExtrasAdapter extends RecyclerView.Adapter<FurtherExtrasAdapter.ViewHolder> { 


ArrayList<Item> items; 
Context context; 
int flag = 0; 
private CouponCodeActivity mThis; 

public FurtherExtrasAdapter(ArrayList<Item> items, CouponCodeActivity mThis, Context context) { 
    this.items = items; 
    this.mThis = mThis; 
    this.context = context; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell_platform_item, parent, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 

    ; 
    holder.enrolment.setText(items.get(position).getName()); 
    holder.selectEnrollment.setChecked(items.get(position).isPreselect()); 
    holder.selectEnrollment.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (items.get(position).isPreselect()) { 
       items.get(position).setPreselect(false); 

      } else { 
       EnforcedExclusivity(position); 

      } 
     } 
    }); 

} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 

public void EnforcedExclusivity(int index) { 

    if (items.get(index).isExclusive()) { 
     items.get(index).setPreselect(true); 

     for (int i = 0; i < items.size(); i++) { 
      if (i == index) { 
       continue; 
      } 
      items.get(i).setPreselect(false); 
     } 


    } else { 
     for (int i = 0; i < items.size(); i++) { 
      if (items.get(i).isExclusive()) { 
       items.get(i).setPreselect(false); 

      } 
      items.get(index).setPreselect(true); 


     } 


    } 
    notifyDataSetChanged(); 
} 

@Override 
public long getItemId(int position) { 
    return super.getItemId(position); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 
    TextView enrolment; 
    CheckBox selectEnrollment; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     enrolment = (TextView) itemView.findViewById(R.id.tv_entrollment); 
     selectEnrollment = (CheckBox) itemView.findViewById(R.id.cb_select_entrollment); 
     selectEnrollment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 

        mThis.updateButtonState(1); 
       } else { 

        mThis.updateButtonState(-1); 
       } 
      } 
     }); 

    } 
}} 

내보기 클래스에는 아래 코드가 들어 있습니다.

rv_further=(RecyclerView)findViewById(R.id.rv_further); 
    rv_further.setLayoutManager(manager); 
      rv_further.setVisibility(View.VISIBLE); 
      rv_further.setHasFixedSize(true); 
      rv_further.setItemAnimator(new DefaultItemAnimator()); 
      rv_further.setAdapter(adapter); 

public void updateButtonState(double num) { 

    checkedBoxs += num; 

     if (checkedBoxs > 0) { 
      Log.d("---CHECKED",String.valueOf(checkedBoxs)); 
      btnApply.setEnabled(true); 
     } else { 
      Log.d("---UNCHECKED",String.valueOf(checkedBoxs)); 
      btnApply.setEnabled(false); 
     } 
} 
+0

selectEnrollment 객체에 대해 두 개의 이벤트를 추가했습니다. 하나는 클릭 리스너이고 다른 하나는 setOnCheckedChangeListener (...)입니다 ... – Noorul

+0

그것에 어떤 거래가 있습니까? –

+0

두 개의 이벤트를 확인란에 사용할 필요가 있습니다. setOnCheckedChangeListener()가 충분합니다. – Noorul

답변

0

먼저 모든 수신기를 onBind (...) 메소드로 이동해보십시오. onBind (...)의 첫 번째 줄에서 모든 청취자를 null로 설정 한 후 해당 점심 세트 뒤에 올바른 데이터로 setSelected (...)하고 원하는 청취자에게 청취자를 설정합니다.

+0

작동합니까? –

+0

작동하지 않습니다. –

관련 문제