2017-03-06 33 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

它不工作 –

相關問題