2017-10-27 9 views
0

私は自分のCustomAdapterでListViewを作成しています。 ListViewの各行には、このlibraryから使用したトグルボタンがあります。だからここに私はそれが正しい行の位置を返しトグル状態を変更すると、私のアダプターコードViewHolderパターンでListView内のイベントリスナーが間違ったアイテムをトリガーする

public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    Attendance attendance = getItem(position); 

    if(convertView==null){ 
     convertView = LayoutInflater.from(context).inflate(R.layout.student_attendance_list_model,parent,false); 
     holder = new ViewHolder(); 
     holder.studentName = (TextView)convertView.findViewById(R.id.student_name); 
     holder.studentSchool = (TextView)convertView.findViewById(R.id.student_school); 
     holder.bulletIcon = (ImageView) convertView.findViewById(R.id.bullet_img); 
     holder.toggleButton = (TriStateToggleButton) convertView.findViewById(R.id.tri_state_toggle); 
     holder.yesText = (TextView)convertView.findViewById(R.id.yes_btn); 
     holder.noText = (TextView)convertView.findViewById(R.id.no_btn); 
     holder.toggleButton.setOnToggleChanged(new TriStateToggleButton.OnToggleChanged() { 
      @Override 
      public void onToggle(TriStateToggleButton.ToggleStatus toggleStatus, boolean b) { 
       switch (toggleStatus){ 
        case off: 
         holder.yesText.setTextColor(context.getResources().getColor(R.color.green)); 
         holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
         break; 
        case mid: 
         holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
         holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
         break; 
        case on: 
         holder.noText.setTextColor(context.getResources().getColor(R.color.trial_color)); 
         holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
         break; 
       } 
      } 
     }); 
     convertView.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.toggleButton.setOnToggleChanged(new TriStateToggleButton.OnToggleChanged() { 
     @Override 
     public void onToggle(TriStateToggleButton.ToggleStatus toggleStatus, boolean b) { 
      LogHelper.debug(getClass(),"pos = "+position); 
      switch (toggleStatus){ 
       case off: 
        holder.yesText.setTextColor(context.getResources().getColor(R.color.green)); 
        holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
        break; 
       case mid: 
        holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
        holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
        break; 
       case on: 
        holder.noText.setTextColor(context.getResources().getColor(R.color.trial_color)); 
        holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
        break; 
      } 
     } 
    }); 

    holder.studentName.setText(attendance.getUserInformation().getFullName()); 
    holder.studentSchool.setText(attendance.getUserInformation().getSchool()); 
    try { 
     switch (attendance.getUserInformation().getStatus()) { 
      case ("enroll"): 
       holder.bulletIcon.setImageResource(R.drawable.enrollment_circle); 
       break; 
      case ("transfer"): 
       holder.bulletIcon.setImageResource(R.drawable.transfer_circle); 
       break; 
      case ("trial"): 
       holder.bulletIcon.setImageResource(R.drawable.trial_circle); 
       break; 
      case ("replace"): 
       holder.bulletIcon.setImageResource(R.drawable.replacement_circle); 
       break; 
     } 
    }catch (Exception e){e.printStackTrace();} 

    switch (attendance.getAttend()){ 
     case ("true"): 
      holder.yesText.setTextColor(context.getResources().getColor(R.color.green)); 
      holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
      holder.toggleButton.setToggleOff(); 
      break; 
     case ("false"): 
      holder.noText.setTextColor(context.getResources().getColor(R.color.trial_color)); 
      holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
      holder.toggleButton.setToggleOn(); 
      break; 
     default: 
      //holder.toggleButton.setMidColor(context.getResources().getColor(R.color.grey_87)); 
      holder.toggleButton.setToggleMid(); 
      holder.noText.setTextColor(context.getResources().getColor(R.color.black_text)); 
      holder.yesText.setTextColor(context.getResources().getColor(R.color.black_text)); 
      break; 
    } 
    return convertView; 
} 


class ViewHolder { 
    TextView studentName; 
    TextView studentSchool; 
    ImageView bulletIcon; 
    TriStateToggleButton toggleButton; 
    TextView yesText; 
    TextView noText; 

} 

だが、そのyesTextとnoTextは色を変えていません。代わりに、トグルをクリックするたびに、最後のアイテムのyesTextとnoTextがトリガーされて色が変わります。上記

Button onClick get wrong position in viewholder patterned listview

リンクは私と全く同じ問題を抱えているが、私は私の場合には)notifyDataSetChanged(の実装について理解していません。

おかげ

答えて

0

削除toggleChangeListenerswitchブロックからテキストの色を設定し、その代わりに、「真」「偽」とデフォルト値とその位置でオブジェクトを更新するためのコードと後に、それはちょうどnotifyDataSetChanged

+0

素晴らしいアイデアを呼びます!ありがとう – VincentTheonardo

関連する問題