0

Hallo haben und erweiterbare Listenansicht, dass jeder Header, wenn erweitert, hat nur ein Kind mit einigen EditText innerhalb. Das Problem ist, wenn ich einen Header erweitern und etwas auf den Editiertext setzen, wenn ich einen anderen Header erweitere, geht der Wert, den ich setze, zu einem anderen Kind als das Original. Ich weiß, dass ListViews Ansichten beim Scrollen wiederverwendet, und ich setze ViewHolders, aber ich kann es nicht funktionieren lassen.EditText geht an ein anderes Kind auf ExpandableListView

Hier ist mein CustomAdapter Code:

public class ExpandableListAddDataAdapter extends BaseExpandableListAdapter { 

private Context _context; 
private List<String> _listDataHeader = new ArrayList<>(); // header titles 
private Date sportsDate, medsDate, glucoseDate, mealDate, auxDate; 

public ExpandableListAddDataAdapter(Context context, List<String> listDataHeader) { 
    this._context = context; 
    this._listDataHeader = listDataHeader; 
    this.sportsDate = new Date(1900,1,1); 
    this.medsDate = new Date(1900,1,1); 
    this.glucoseDate = new Date(1900,1,1); 
    this.mealDate = new Date(1900,1,1); 
    this.auxDate = new Date(1900,1,1); 
} 

@Override 
public String[] getChild(int groupPosition, int childPosititon) { 
    return null; 
} 


@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

@Override 
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    final ChildViewHolder holder; 
    View row = convertView; 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = infalInflater.inflate(R.layout.expandable_data_add_child, parent,false); 
     holder = new ChildViewHolder(row); 
     row.setTag(holder); 
    }else{ 
     holder = (ChildViewHolder) row.getTag(); 
    } 

    this.auxDate = new Date(1900,1,1); 
    switch (groupPosition){ 
     case 0: 
      auxDate = new Date(this.glucoseDate.getTime()); 
      break; 
     case 1: 
      auxDate = new Date(this.mealDate.getTime()); 
      break; 
     case 2: 
      auxDate = new Date(this.sportsDate.getTime()); 
      break; 
     case 3: 
      auxDate = new Date(this.medsDate.getTime()); 
      break; 
    } 


    final View finalConvertView = row; 
    holder.txtDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int mYear, mMonth, mDay; 
      if(auxDate.getYear() != 1900){ 
       mYear = auxDate.getYear(); 
       mMonth = auxDate.getMonth(); 
       mDay = auxDate.getDay(); 
      }else{ 
       Calendar mcurrentDate = Calendar.getInstance(); 
       mYear = mcurrentDate.get(Calendar.YEAR); 
       mMonth = mcurrentDate.get(Calendar.MONTH); 
       mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH); 
      } 

      DatePickerDialog mDatePicker = new DatePickerDialog(finalConvertView.getContext(), new DatePickerDialog.OnDateSetListener() { 
       @Override 
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
        auxDate.setYear(year - 1900); 
        auxDate.setMonth(monthOfYear); 
        auxDate.setDate(dayOfMonth); 
        if (dayOfMonth < 10) { 
         holder.txtDate.setText(0 + dayOfMonth + "/" + (monthOfYear + 1) + "/" + year); 
        } else { 
         holder.txtDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year); 
        } 
        switch (groupPosition){ 
         case 0: 
          glucoseDate = new Date(auxDate.getTime()); 
          break; 
         case 1: 
          mealDate = new Date(auxDate.getTime()); 
          break; 
         case 2: 
          sportsDate = new Date(auxDate.getTime()); 
          break; 
         case 3: 
          medsDate = new Date(auxDate.getTime()); 
          break; 
        } 
       } 
      }, mYear, mMonth, mDay); 
      mDatePicker.show(); 
     } 
    }); 
    holder.txtTime.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int mHour, mMinute; 
      if(auxDate.getHours() != 0){ 
       mHour = auxDate.getHours(); 
       mMinute = auxDate.getMinutes(); 
      }else{ 
       Calendar mcurrentDate = Calendar.getInstance(); 
       mHour = mcurrentDate.get(Calendar.HOUR_OF_DAY); 
       mMinute = mcurrentDate.get(Calendar.MINUTE); 
      } 

      TimePickerDialog mTimePicker = new TimePickerDialog(finalConvertView.getContext(), new TimePickerDialog.OnTimeSetListener() { 
       @Override 
       public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
        auxDate.setHours(hourOfDay); 
        auxDate.setMinutes(minute); 
        if (minute < 10) { 
         holder.txtTime.setText(hourOfDay + ":" + 0 + minute); 
        } else { 
         holder.txtTime.setText(hourOfDay + ":" + minute); 
        } 
        switch (groupPosition){ 
         case 0: 
          glucoseDate = auxDate; 
          break; 
         case 1: 
          mealDate = auxDate; 
          break; 
         case 2: 
          sportsDate = auxDate; 
          break; 
         case 3: 
          medsDate = auxDate; 
          break; 
        } 
       } 
      }, mHour, mMinute, false); 
      mTimePicker.show(); 
     } 
    }); 
    return row; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return 1; 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return this._listDataHeader.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return this._listDataHeader.size(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
    final HeaderViewHolder holder; 
    View row = convertView; 
    String headerTitle = (String) getGroup(groupPosition); 
    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = infalInflater.inflate(R.layout.expandable_data_add_header, parent,false); 
     holder = new HeaderViewHolder(row); 
     row.setTag(holder); 
    }else{ 
     holder = (HeaderViewHolder) row.getTag(); 
    } 
    if (isExpanded) { 
     holder.expandIndicator.setImageResource(R.drawable.minus); 
    } else { 
     holder.expandIndicator.setImageResource(R.drawable.plus); 
    } 
    holder.txtHeader.setTypeface(null, Typeface.BOLD); 
    holder.txtHeader.setText(headerTitle); 

    return row; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 

private static class ChildViewHolder { 
    EditText txtDate; 
    EditText txtTime; 
    EditText txtGlucose; 
    ChildViewHolder(View v) 
    { 
     txtDate = (EditText) v.findViewById(R.id.input_event_date); 
     txtTime = (EditText) v.findViewById(R.id.input_event_time); 
     txtGlucose = (EditText) v.findViewById(R.id.input_glucose); 

    } 
} 

private static class HeaderViewHolder { 
    TextView txtHeader; 
    ImageView expandIndicator; 

    HeaderViewHolder(View v) 
    { 
     txtHeader = (TextView) v.findViewById(R.id.expandable_add_data_header_text); 
     expandIndicator = (ImageView) v.findViewById(R.id.expandable_add_data_header_icon); 

    } 
    } 
} 

Und das ist ein paar Screenshoots für das Problem, dass ich

The first header expanded with the edittext

Second header expanded and the value of the firt edittext goes to the second header child

Antwort

0

Schließlich zugewandt ich die gefunden habe Lösung. Die solutionm wurde das Hinzufügen eines TextWatcher für jeden EditText wie folgt aus:

holder.position = groupPosition; 
    holder.txtGlucose.setText(arrInput[groupPosition]); 
    holder.txtGlucose.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
      arrInput[holder.position] = arg0.toString(); 
     } 
    }); 

Wo arrInput ist ein String [], wo ich die Werte speichern für dieses EditText

Verwandte Themen