gpt4 book ai didi

android - 如何用两个不同的对象填充 ExpandableListView

转载 作者:行者123 更新时间:2023-11-29 23:49:55 26 4
gpt4 key购买 nike

我有一个可扩展 ListView ,想用两个不同的对象填充它,目前我只是用 Tareas 对象填充子项,但想用不同的对象 (Metas) 填充同一个子项列表。我怎样才能做到这一点,因为我的适配器只是用 Tareas 对象填充列表,而不是接受 Metas 对象。

UPDATE

这是我的 ExpandableListViewAdapter:

public class CalendarioAdapter extends BaseExpandableListAdapter {
private Context mContext;
private List<String> mCalendarioListHeader;
private HashMap<String, List<Object>> mCalendarioListChild;
private static final int CHILD_TYPE_META = 0;
private static final int CHILD_TYPE_PLANES = 1;


public CalendarioAdapter(Context context, List<String> listDataHeader,
HashMap<String, List<Object>> listChildData) {
this.mContext= context;
this.mCalendarioListHeader= listDataHeader;
this.mCalendarioListChild = listChildData;
}
@Override
public int getChildTypeCount() {
return 2;
}


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

@Override
public int getChildrenCount(int groupPosition) {
List childList = mCalendarioListChild.get(mCalendarioListHeader.get(groupPosition));
if (childList != null && ! childList.isEmpty()) {
return childList.size();
}
return 0;
}


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

@Override
public Object getChild(int groupPosition, int childPosition) {
return this.mCalendarioListChild.get(this.mCalendarioListHeader.get(groupPosition))
.get(childPosition);
}

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

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

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
String listSize = getChildrenCount(groupPosition) +"";
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.calendario_list_header, null);
}

TextView lblListHeader = (TextView) convertView
.findViewById(R.id.lblListHeader);
TextView sizeOfList = (TextView) convertView.findViewById(R.id.calendarioListSize);
sizeOfList.setText(listSize);
lblListHeader.setTypeface(null, Typeface.BOLD);
lblListHeader.setText(headerTitle);

return convertView;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {


Integer childType = (getChildType(groupPosition, childPosition));
Log.d("childType", childType+"");

LayoutInflater layoutInflater = (LayoutInflater) this.mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null|| convertView.getTag() != childType) {

switch (childType) {

case CHILD_TYPE_META:
convertView = layoutInflater.inflate(R.layout.metas_list_row, null);
convertView.setTag(childType);
break;
case CHILD_TYPE_PLANES:
convertView = layoutInflater.inflate(R.layout.calendario_list_row, null);
convertView.setTag(childType);
break;
default:

break;
}
}
switch (childType) {
case CHILD_TYPE_META:
Metas metas = (Metas) getChild(groupPosition, childPosition);
TextView txtMetasChild = convertView.findViewById(R.id.metasTxtChild);
TextView fechaMetasChild = convertView.findViewById(R.id.fechaMetaChild);
txtMetasChild.setText(metas.getMeta());
fechaMetasChild.setText(metas.getFecha());
break;
case CHILD_TYPE_PLANES:
Tareas tareas = (Tareas) getChild(groupPosition, childPosition);
TextView txtDescripcionChild = (TextView) convertView
.findViewById(R.id.descripcionTareaText);
TextView txtListaChild = (TextView) convertView
.findViewById(R.id.listaTareaText);
txtDescripcionChild.setText(tareas.getDescripcion());
txtListaChild.setText(tareas.getLista());
break;

default:
break;
}

return convertView;


}

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

@Override
public int getChildType(int groupPosition, int childPosition) {
Object child = getChild(groupPosition, childPosition);
Log.d("ChildType", child+"");
if(child instanceof Metas){
return CHILD_TYPE_META;
} else if(child instanceof Tareas) {
return CHILD_TYPE_PLANES;
}
else{
// should never happen, so do error handling here
throw new RuntimeException("only classes Metas and Tareas permitted");
}
}
}

And on my Fragment I populate the list like this:

       private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<Object>>();

// Adding header data
listDataHeader.add(diasText[0]);
listDataHeader.add(diasText[1]);
listDataHeader.add(diasText[2]);
listDataHeader.add(diasText[3]);
listDataHeader.add(diasText[4]);
listDataHeader.add(diasText[5]);
listDataHeader.add(diasText[6]);

// Adding child data

listDataChild.put(listDataHeader.get(0), dia1List);
listDataChild.put(listDataHeader.get(1), dia2List);
listDataChild.put(listDataHeader.get(2), dia3List);
listDataChild.put(listDataHeader.get(3), dia4List);
listDataChild.put(listDataHeader.get(4), dia5List);
listDataChild.put(listDataHeader.get(5), dia6List);
listDataChild.put(listDataHeader.get(6), dia7List);
}

任何关于如何实现我的要求的想法都将不胜感激!

最佳答案

子类化时 BaseExpandableListAdapter , 你可以提供不同的 View组项目和子项目的类型。我只会概述如何做不同的 child View types 因为那是你想要做的(即便如此,帖子也会变得足够长)。

View类型由 int 表示值,例如

private static final int TYPE_TAREAS = 0;
private static final int TYPE_METAS = 2;

所以在你的情况下你传递了一个 HashMap<String, List<Object>>而不是 HashMap<String, List<Tareas>>并覆盖 getChildTypeCount()返回 2(不同 View 类型的数量)。 (当然你也可以使用 TareasMetas 的任何共同祖先来代替 Object )

然后你覆盖getChildType (int groupPosition, int childPosition)返回正确的 int View 的值(TYPE_TAREAS 或 TYPE_METAS)键入此特定条目。要确定类型,请使用 instanceofList 上条目。

最后,当覆盖 getChildView() 时, 你在 List 上做必要的类型转换输入并确定 View通过调用 getChildType() 输入.一如既往ListView ,您可以重用convertView

这是 documentation for getChildView() 的内容在这个话题上说:

convertView View: the old view to reuse, if possible. You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. It is not guaranteed that the convertView will have been previously created by getChildView(int, int, boolean, View, ViewGroup).

如果 convertView 不能被重用,你创建一个新的 View根据View通过膨胀所需的布局来键入。遵循 ViewHolder 模式是个好主意。您可能需要两个完全不同的 ViewHolder 或一个从另一个扩展,这取决于您的两个数据类之间的差异。

其余一切如常:-)

关于android - 如何用两个不同的对象填充 ExpandableListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com