안녕하세요 확장 가능한 목록보기, 확장 할 때 모든 헤더에는 일부 EditText가있는 자식이 하나만 있습니다. 문제는 내가 하나의 헤더를 확장하고 edittext에 뭔가를 집어 넣을 때, 다른 헤더를 확장 할 때, 내가 둔 값이 원래의 다른 자식에게 돌아 간다는 것입니다. ListViews는 스크롤 할 때 뷰를 재사용한다는 것을 알고 ViewHolders를 넣었지만 제대로 작동하지는 않습니다. 여기 EditText는 ExpandableListView의 다른 자식에게 전달됩니다.
내 CustomAdapter 코드 :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);
}
}
}
그리고 이것은 내가 발견 한 내가
The first header expanded with the edittext
마지막으로Second header expanded and the value of the firt edittext goes to the second header child