2017-01-04 7 views
0

Ich hatte eine Liste von cardviews erstellt, die Zeitreihen von 0:00 bis 23:00 mit einem Intervall von 15 Minuten sind, also [0:00, 0:15, ...., 22:45, 23:00] jetzt möchte ich onClick auf die Karten implementieren und wenn ich auf eine Karte klicke, wird auf der Karte ein Häkchen gesetzt mit aktiviert als gesetzt, und wenn ich auf eine andere Karte klicke, die vorher angeklickte Karte Checkbox wird gesetzt als falsch und unsichtbar, während die neuen ein getestetes CheckboxAndroid cardview onclick implementation

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

    private Context context; 

    List<SuggestTimeList> suggestTimeLists; 

    public SuggestTimeCardAdapter(List<SuggestTimeList> suggestTimeLists, Context context){ 
     super(); 
     this.suggestTimeLists = suggestTimeLists; 
     this.context = context; 
    } 

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

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

     SuggestTimeList suggestTimeList = suggestTimeLists.get(position); 

     holder.tvSuggestTime.setText(suggestTimeList.getSuggestTime()); 

     holder.suggest_time_card_view.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v){ 
       //implement the click 
       holder.cbSuggestTime.setVisibility(View.VISIBLE); 
       holder.cbSuggestTime.setChecked(true); 
      } 
     }); 


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

    class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView tvSuggestTime; 
     public CheckBox cbSuggestTime; 
     public CardView suggest_time_card_view; 


     public ViewHolder(View itemView) { 
      super(itemView); 
      tvSuggestTime = (TextView) itemView.findViewById(R.id.tvSuggestTime); 
      cbSuggestTime = (CheckBox) itemView.findViewById(R.id.cbSuggestTime); 
      suggest_time_card_view = (CardView) itemView.findViewById(R.id.suggest_time_card_view); 


     } 
    } 
} 

Nun ich habe das Problem enthält, ist, dass, wenn ich auf einer Karte klicken, zum Beispiel 00.00, dann alle Karten mit Zuwachs von 2:15 wird überprüft, so dass 2:15, 4:30 usw. alle überprüft werden, dann beim Scrollen und nicht auf ein klicken Die checked cards werden plötzlich deaktiviert und zufällige Karten werden überprüft. Ich bin hier verwirrt, kann jemand bitte helfen?

Antwort

0

Fügen Sie in Ihrer SuggestTimeList Klasse ein Attribut hinzu; isChecked, wie folgt aus:

class SuggestTimeList 
{ 
    boolean isChecked; 
    //// Other attributes and methods... 
    public void setChecked(boolean isChecked) { 
     this.isChecked = isChecked; 
    } 

    public boolean isChecked() { 
     return isChecked; 
    } 
} 

Dann in Ihrem Adapter dies zu tun:

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

    SuggestTimeList suggestTimeList = suggestTimeLists.get(position); 

    holder.tvSuggestTime.setText(suggestTimeList.getSuggestTime()); 
    if(suggestTimeList.isChecked()) { 
      holder.cbSuggestTime.setVisibility(View.VISIBLE); 
      holder.cbSuggestTime.setChecked(true); 
    }else { 
      holder.cbSuggestTime.setChecked(false); 
      holder.cbSuggestTime.setVisibility(View.INVISIBLE); 
    } 
    holder.suggest_time_card_view.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v){ 
      //implement the click 
      holder.cbSuggestTime.setVisibility(View.VISIBLE); 
      holder.cbSuggestTime.setChecked(true); 
      for(SuggestTimeList s : suggestTimeLists) { 
       s.setChecked(false); 
      } 
      suggestTimeList.setChecked(true); 
      notifyDataSetChanged(); 

     } 
    }); 


} 
+0

Vielen Dank für Ihre Antwort, löst das Problem für nicht andere Karten, die überprüft, wenn ich auf eine Karte klicken. Wir müssen isChecked als false in der SuggestTimeList-Klasse definieren, da dies ein Null-Objekt ist, wenn wir dies nicht tun. Wenn ich jedoch auf die zweite Karte klicke, wird die erste Karte in Ihrer Situation noch überprüft. Auch nach dem Scrollen und Scrollen wird die markierte Karte automatisch deaktiviert – JerryKo

+0

Es wird nicht null sein, ich habe das primitive 'boolean' verwendet. Es ist standardmäßig "falsch" :). Zweitens kann das Problem, das Sie identifiziert haben, gelöst werden, indem 'notifyDataSetChanged();' nach 'suggestTimeList.setChecked (true);' im Klick-Listener aufgerufen wird. –

+0

Können Sie mir freundlicherweise zeigen, wie Sie notifyDataSetChanged verwenden? Ich habe versucht, es mit meinem Adapter suggestTimeLists zu verwenden, aber es konnte nicht funktionieren. Danke – JerryKo