具有多种布局的 ExpandableListView
ExpandableListView with multiple layouts
我为我的英语道歉但用 google 翻译。我的申请需要帮助,
我正在使用具有 3 种不同布局的 ExpandableListView,但我遇到了一些问题,我在各种论坛上都没有找到答案。基本上,如果方法 getChildView () 检查 convertView 是否为 null,我会偏移所有布局,甚至会重复它们几次。如果我不进行检查,您会看到应有的布局,但是如果我单击另一个组或者如果您浏览列表直到不再显示带有 EditText 的布局,EditText 中的值将被删除。
我希望我足够清楚,我希望答案同样清楚,不幸的是我已经在互联网上到处都是,但找不到我正在寻找的答案。
在此先感谢那些愿意帮助我的人
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
if (groupPosition == 0) {
convertView = infalInflater.inflate(R.layout.adv_item, null);
holder.btn1 = (ImageButton) convertView
.findViewById(R.id.button1);
holder.btn2 = (ImageButton) convertView
.findViewById(R.id.button2);
holder.btn3 = (ImageButton) convertView
.findViewById(R.id.button3);
holder.et1 = (EditText) convertView.findViewById(R.id.editText1);
holder.et2 = (EditText) convertView.findViewById(R.id.editText2);
holder.et3 = (EditText) convertView.findViewById(R.id.editText3);
holder.et4 = (EditText) convertView.findViewById(R.id.editText4);
holder.et5 = (EditText) convertView.findViewById(R.id.editText5);
holder.et6 = (EditText) convertView.findViewById(R.id.editText6);
holder.check_sc1 = (CheckBox) convertView
.findViewById(R.id.item_check_sc1);
holder.check_sc2 = (CheckBox) convertView
.findViewById(R.id.item_check_sc2);
holder.check_sc3 = (CheckBox) convertView
.findViewById(R.id.item_check_sc3);
holder.check_oo = (CheckBox) convertView
.findViewById(R.id.item_check_oo);
convertView.setTag(holder);
}
if (groupPosition == 1) {
convertView = infalInflater.inflate(R.layout.visual_item, null);
}
if (groupPosition == 2) {
convertView = infalInflater.inflate(R.layout.routes_item, null);
}
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
现在您的列表 "know" 没有三种不同类型的记录。您需要 "tell" 它通过覆盖适配器的下一个功能:
@Override
public int getViewTypeCount() {
return 3; // <-- Here goes your view types count
}
您还需要覆盖 Adapter 的函数以确定要使用的视图类型:
@Override
public int getItemViewType(int position) {
return getItemViewType(position); // <-- Here must be your logic to get the type of the item
}
所以现在 Android 有一个包含三种类型的列表项的池可供您使用。现在您不需要 'if (groupPosition == 2)'(等等),因为 ListView 将使用这些函数来确定正确的布局以传递到适配器的 'getView()' 函数中。
以上内容适用于 简单的 ListAdapters.
至于ExpandableAdapters它们有类似的功能:
public int getGroupTypeCount ()
public int getGroupType (int groupPosition)
public int getChildType (int groupPosition, int childPosition)
public int getChildTypeCount ()
您需要覆盖全部或部分设置,具体取决于您是否对组使用不同的布局。
至于你的情况,我建议尝试这样的事情:
@Override
public int getChildTypeCount () {
return 3; <-- you have three types of views
}
@Override
public int getChildType (int groupPosition, int childPosition) {
/*
* In case of group 1 this function returns 1,
* in case of group 2 it returns 2, and so on.
*/
return groupPosition;
}
我为我的英语道歉但用 google 翻译。我的申请需要帮助, 我正在使用具有 3 种不同布局的 ExpandableListView,但我遇到了一些问题,我在各种论坛上都没有找到答案。基本上,如果方法 getChildView () 检查 convertView 是否为 null,我会偏移所有布局,甚至会重复它们几次。如果我不进行检查,您会看到应有的布局,但是如果我单击另一个组或者如果您浏览列表直到不再显示带有 EditText 的布局,EditText 中的值将被删除。 我希望我足够清楚,我希望答案同样清楚,不幸的是我已经在互联网上到处都是,但找不到我正在寻找的答案。 在此先感谢那些愿意帮助我的人
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
if (groupPosition == 0) {
convertView = infalInflater.inflate(R.layout.adv_item, null);
holder.btn1 = (ImageButton) convertView
.findViewById(R.id.button1);
holder.btn2 = (ImageButton) convertView
.findViewById(R.id.button2);
holder.btn3 = (ImageButton) convertView
.findViewById(R.id.button3);
holder.et1 = (EditText) convertView.findViewById(R.id.editText1);
holder.et2 = (EditText) convertView.findViewById(R.id.editText2);
holder.et3 = (EditText) convertView.findViewById(R.id.editText3);
holder.et4 = (EditText) convertView.findViewById(R.id.editText4);
holder.et5 = (EditText) convertView.findViewById(R.id.editText5);
holder.et6 = (EditText) convertView.findViewById(R.id.editText6);
holder.check_sc1 = (CheckBox) convertView
.findViewById(R.id.item_check_sc1);
holder.check_sc2 = (CheckBox) convertView
.findViewById(R.id.item_check_sc2);
holder.check_sc3 = (CheckBox) convertView
.findViewById(R.id.item_check_sc3);
holder.check_oo = (CheckBox) convertView
.findViewById(R.id.item_check_oo);
convertView.setTag(holder);
}
if (groupPosition == 1) {
convertView = infalInflater.inflate(R.layout.visual_item, null);
}
if (groupPosition == 2) {
convertView = infalInflater.inflate(R.layout.routes_item, null);
}
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
现在您的列表 "know" 没有三种不同类型的记录。您需要 "tell" 它通过覆盖适配器的下一个功能:
@Override
public int getViewTypeCount() {
return 3; // <-- Here goes your view types count
}
您还需要覆盖 Adapter 的函数以确定要使用的视图类型:
@Override
public int getItemViewType(int position) {
return getItemViewType(position); // <-- Here must be your logic to get the type of the item
}
所以现在 Android 有一个包含三种类型的列表项的池可供您使用。现在您不需要 'if (groupPosition == 2)'(等等),因为 ListView 将使用这些函数来确定正确的布局以传递到适配器的 'getView()' 函数中。 以上内容适用于 简单的 ListAdapters.
至于ExpandableAdapters它们有类似的功能:
public int getGroupTypeCount ()
public int getGroupType (int groupPosition)
public int getChildType (int groupPosition, int childPosition)
public int getChildTypeCount ()
您需要覆盖全部或部分设置,具体取决于您是否对组使用不同的布局。 至于你的情况,我建议尝试这样的事情:
@Override
public int getChildTypeCount () {
return 3; <-- you have three types of views
}
@Override
public int getChildType (int groupPosition, int childPosition) {
/*
* In case of group 1 this function returns 1,
* in case of group 2 it returns 2, and so on.
*/
return groupPosition;
}