android– 如何将Viewholder与ExpandableListView一起使用?

android– 如何将Viewholder与ExpandableListView一起使用?,第1张

概述我正在尝试在我的应用程序中创建一个ExpandableListView.它有两组:第一组是颜色,第二组是符号.点击的第一组工作正常.但是,第二组显示第一组中的行(如果第二组中有更多项,那么’额外’将是正确的).例如,我们说’颜色’是白色,黑色,红色和蓝色,符号是’/’和’.’.如果我启动活动并

我正在尝试在我的应用程序中创建一个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一起使用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1108405.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存