gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:53 25 4
gpt4 key购买 nike

我正在尝试在我的应用程序中创建一个 ExpandableListView。它有两组:第一组是颜色,第二组是符号。第一组点击效果很好。然而,第二组显示第一组中的行(如果第二组中有更多项目,则“额外”的项目将是正确的)。

例如,假设“颜色”是白色、黑色、红色和蓝色,符号是“/”和“.”。

如果我开始 Activity 并点击颜色,它们就会正确显示。如果我随后点击“符号”,我会看到白色和黑色。

如果我先单击“符号”,然后我会看到“/”和“.”,但是当我随后单击颜色时,我会看到“/”、“.”、红色、蓝色。

我在网上搜索并确定我需要使用 ViewHolders 以避免它在我更改组时重复使用相同的 View 。虽然我没能实现它。一开始没什么区别,点第二组的时候当前版本就闪退了。我认为部分问题是我为每个组设置了不同的子布局(即符号与颜色的显示方式不同)。

目前这是我所拥有的(我已经展示了我认为相关的部分;如果我遗漏了任何重要的内容,我可以添加它):

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() 以便适配器将接收正确的 View 类型以供重用。否则,在某些情况下,您将在尝试检索 ViewHolder 时收到 ClassCastException

@Override
public int getChildTypeCount() {
return 2;
}

@Override
public int getChildType(int groupPosition, int childPosition) {
KeyItem childItem = (KeyItem) getChild(groupPosition, childPosition);
return (childItem.getPatternColour() == null) ? 0 : 1;
}

有关详细信息,请参阅 HeterogeneousExpandableList文档。

关于android - 如何将 Viewholder 与 ExpandableListView 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855702/

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