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