
我正在尝试在我的应用程序中创建一个ExpandableListVIEw.它有两组:第一组是颜色,第二组是符号.点击的第一组工作正常.但是,第二组显示第一组中的行(如果第二组中有更多项,那么’额外’将是正确的).
例如,我们说’颜色’是白色,黑色,红色和蓝色,符号是’/’和’.’.
如果我启动活动并单击颜色,则它们会正确显示.如果我然后点击“符号”,我会看到白色和黑色.
如果我先点击’符号’,然后我会看到’/’和’.’,但是当我点击颜色时,我会看到’/’,’.’,红色,蓝色.
我在网上搜索并确定我需要使用VIEwHolders以避免在我更改组时重复使用相同的视图.我虽然无法实现它.起初它没有任何区别,当我点击第二组时,当前版本崩溃了.我认为问题的一部分是我为每个组设置了不同的子布局(即符号的显示方式与颜色不同).
目前这就是我所拥有的(我已经展示了我认为的相关内容;如果我遗漏了任何重要内容,我可以添加它):
public class ColourSymbolKeyAdapter extends Baseexpandablelistadapter { private Context context; private HashMap<String, List<KeyItem>> childDataSource; private List<String> parentDataSource; public ColourSymbolKeyAdapter(Context context, List<String> childParent, HashMap<String, List<KeyItem>> child) { this.context = context; this.parentDataSource = childParent; this.childDataSource = child; }... left out varIoUs overrIDe functions ... @OverrIDe public VIEw getGroupVIEw(int groupposition, boolean isExpanded, VIEw convertVIEw, VIEwGroup parent) { VIEw v = convertVIEw; GroupVIEwHolder holder; if(v == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.expandableList_parent, parent, false); holder = new GroupVIEwHolder(); holder.mGroupname = (TextVIEw) v.findVIEwByID(R.ID.textVIEwParent); v.setTag(holder); }else { holder = (GroupVIEwHolder) v.getTag(); } String parentheader = (String) getGroup(groupposition); holder.mGroupname.setText(parentheader); return v; } @OverrIDe public VIEw getChildVIEw(int groupposition, int childposition, boolean isLastChild, VIEw convertVIEw, VIEwGroup parent) { VIEw row = convertVIEw; KeyItem childItem = (KeyItem) getChild(groupposition, childposition); ColourVIEwHolder colourvIEwholder; SymbolVIEwHolder symbolvIEwholder; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(childItem.getPatternColour() == null) { // This is a symbol row if(row == null) { symbolvIEwholder = new SymbolVIEwHolder(); row = inflater.inflate(R.layout.expandableList_child_symbol, parent, false); symbolvIEwholder.mChildname = (TextVIEw) row.findVIEwByID(R.ID.symbol_desc); symbolvIEwholder.mSymbolCell = (SymbolCell) row.findVIEwByID(R.ID.symbol_cell); row.setTag(symbolvIEwholder); }else { symbolvIEwholder = (SymbolVIEwHolder) row.getTag(); } String drawablename = childItem.getPatternSymbol().getDrawable(); final int resourceID = context.getResources().getIDentifIEr(drawablename, "drawable", context.getPackagename()); Drawable drawable; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LolliPOP) { drawable = context.getResources().getDrawable(resourceID, context.gettheme()); } else { drawable = context.getResources().getDrawable(resourceID); } symbolvIEwholder.mSymbolCell.setDrawable(drawable); symbolvIEwholder.mChildname.setText(childItem.getPatternSymbol().getSymbolDescription()); }else { // This is a colour row if(row == null) { colourvIEwholder = new ColourVIEwHolder(); row = inflater.inflate(R.layout.expandableList_child_colour, parent, false); colourvIEwholder.mChildname = (TextVIEw) row.findVIEwByID(R.ID.colour_name); colourvIEwholder.mChildDesc = (TextVIEw) row.findVIEwByID(R.ID.colour_desc); colourvIEwholder.mColourCell = (ColourCell) row.findVIEwByID(R.ID.colour_cell); row.setTag(colourvIEwholder); }else { colourvIEwholder = (ColourVIEwHolder) row.getTag(); } colourvIEwholder.mColourCell.setColour(childItem.getPatternColour()); colourvIEwholder.mChildname.setText(childItem.getPatternColour().getname()); colourvIEwholder.mChildDesc.setText(childItem.getPatternColour().getDescription()); } return row; } public final class GroupVIEwHolder { TextVIEw mGroupname; } public final class ColourVIEwHolder { ColourCell mColourCell; TextVIEw mChildname, mChildDesc; } public final class SymbolVIEwHolder { SymbolCell mSymbolCell; TextVIEw mChildname; }}父级布局(expandableList_parent.xml):
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:ID="@+ID/parentVIEw"> <TextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:ID="@+ID/textVIEwParent" androID:textcolor="#000000" androID:textAppearance="@style/ParagraphBold"> </TextVIEw></linearLayout>颜色行的布局(expandableList_child_colour.xml):
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:padding="@dimen/small_padding" androID:ID="@+ID/childVIEwColour" androID:orIEntation="horizontal"> <com.myname.appname.ColourCell xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="@dimen/grID_cell_column_wIDth" androID:layout_height="@dimen/grID_cell_column_wIDth" androID:ID="@+ID/colour_cell" androID:layout_marginRight="@dimen/small_padding" /> <linearLayout androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:orIEntation="vertical"> <TextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:textAppearance="@style/ParagraphBold" androID:textcolor="@color/colorPrimaryDark" androID:ID="@+ID/colour_name"> </TextVIEw> <TextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:textAppearance="@style/Paragraph" androID:textcolor="@color/colorPrimaryDark" androID:ID="@+ID/colour_desc"> </TextVIEw> </linearLayout></linearLayout>对于符号行(expandableList_child_symbol.xml):
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:ID="@+ID/childVIEwSymbol" androID:padding="@dimen/small_padding"> <com.myname.appname.SymbolCell xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="@dimen/grID_cell_column_wIDth" androID:layout_height="@dimen/grID_cell_column_wIDth" androID:textAppearance="@style/Paragraph" androID:ID="@+ID/symbol_cell" androID:layout_marginRight="@dimen/small_padding" /> <TextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:textcolor="@color/colorPrimaryDark" androID:ID="@+ID/symbol_desc"> </TextVIEw></linearLayout>如果我先单击“颜色”组,然后单击“符号”组,它会在行上崩溃:symbolvIEwholder =(SymbolVIEwHolder)row.getTag().
解决方法:
由于您有2个不同的子布局,因此需要覆盖getChildTypeCount()和getChildType(),以便适配器将接收要重用的正确视图类型.否则,在某些情况下,在尝试检索VIEwHolder时会出现ClassCastException.
@OverrIDepublic int getChildTypeCount() { return 2;}@OverrIDepublic int getChildType(int groupposition, int childposition) { KeyItem childItem = (KeyItem) getChild(groupposition, childposition); return (childItem.getPatternColour() == null) ? 0 : 1;}有关详细信息,请参阅HeterogeneousExpandableList文档.
以上是内存溢出为你收集整理的android – 如何将Viewholder与ExpandableListView一起使用?全部内容,希望文章能够帮你解决android – 如何将Viewholder与ExpandableListView一起使用?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)