gpt4 book ai didi

android - 展开多级 ExpandableListView 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:31 25 4
gpt4 key购买 nike

我有一个多级(3 级,根 -> 父级 -> 子级)ExpandableListView,其中包含也是 ExpandableListView 的子级。我没有问题把它们填满;但是,当我第一次显示 Activity (onCreate) 时,我需要在 Parent 级别展开特定项目。

我成功展开了Parent 的相关Root 项,但我似乎无法展开Parent 项。调用了给定的监听器,但结果并未反射(reflect)在我的多级列表中。

我称之为扩展的 Activity :

public class Activity {
private int groupToExpand = 4, childToExpand = 3;
protected void onCreate(Bundle savedInstance) {
final ExpandableListView elv = (ExpandableListView) findViewById(R.id.elv);
if (arrayList!= null && !arrayList.isEmpty()) {
elv.setAdapter(new RootAdapter(this, arrayList);
// this selects the correct group, but doesn't expand the child.
elv.setSelectedChild(groupToExpand, childToExpand, true);
elv.expandGroup(groupToExpand); // this works.
}
}
}

我的根适配器:

public class RootAdapter extends BaseExpandableListAdapter {

private List<Objects> arrayList;
private Context context;
private LayoutInflater inflater;

public RootAdapter(Context context, List<Objects> arrayList) {
this.context = context;
this.arrayList = arrayList;
this.inflater = LayoutInflater.from(context);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
final Objects parent = (Objects) getGroup(groupPosition);
return parent.arrayList.get(childPosition);
}

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

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final Objects o = (Objects) getChild(groupPosition, childPosition);

CustomExpandableListView elv = (CustomExpandableListView) convertView;
ChildViewHolder holder;

if (elv == null) {
holder = new ChildViewHolder();

elv = new CustomExpandableListView(context);
elv.setGroupIndicator(null);
elv.setDivider(null);
elv.setCacheColorHint(Color.parseColor("#00000000"));
elv.setChildDivider(null);
elv.setChildIndicator(null);
elv.setScrollingCacheEnabled(false);
elv.setAnimationCacheEnabled(false);

holder.cListView = elv;
elv.setTag(holder);
} else {
holder = (ChildViewHolder) elv.getTag();
}

final ParentAdapter adapter = new ParentAdapter(context, o);
holder.cListView.setAdapter(adapter);

return elv;
}

private static class ChildViewHolder {
CustomExpandableListView cListView;
}

@Override
public int getChildrenCount(int groupPosition) {
final Objects parent = (Objects) getGroup(groupPosition);
return parent.arrayList.size();
}

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

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

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
View layout = convertView;
GroupViewHolder holder;
final Objects o = (Objects) getGroup(groupPosition);

if (layout == null) {
layout = inflater.inflate(R.layout.item_to_inflate, parent, false);
holder = new GroupViewHolder();

holder.title = (TextView) layout.findViewById(R.id.title);
holder.image = (ImageView) layout.findViewById(R.id.image);
layout.setTag(holder);
} else {
holder = (GroupViewHolder) layout.getTag();
}

holder.title.setText(o.title.trim());

return layout;
}

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

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

private static class GroupViewHolder {
TextView title;
ImageView image;
}

public class CustomExpandableListView extends ExpandableListView {

public CustomExpandableListView(Context context) {
super(context);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

}

}

最后是我的 ParentAdapter :

public class ParentAdapter extends BaseExpandableListAdapter {

private Objects child;
private LayoutInflater inflater;

public ParentAdapter(Context context, Objects child) {
this.child = child;
this.inflater = LayoutInflater.from(context);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return child.arrayList.get(childPosition);
}

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

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
View layout = convertView;
final Objects o = (Objects) getChild(0, childPosition);

ChildViewHolder holder;

if (layout == null) {
layout = inflater.inflate(R.layout.item_to_inflate, parent, false);

holder = new ChildViewHolder();
holder.title = (TextView) layout.findViewById(R.id.title);
layout.setTag(holder);
} else {
holder = (ChildViewHolder) layout.getTag();
}

holder.title.setText(o.title.trim());

return layout;
}

@Override
public int getChildrenCount(int groupPosition) {
return child.arrayList.size();
}

@Override
public Object getGroup(int groupPosition) {
return child;
}

@Override
public int getGroupCount() {
return 1;
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
View layout = convertView;
GroupViewHolder holder;

if (layout == null) {
layout = inflater.inflate(R.layout.item_to_inflate, parent, false);
holder = new GroupViewHolder();

holder.image = (ImageView) layout.findViewById(R.id.image);
holder.title = (TextView) layout.findViewById(R.id.title);
layout.setTag(holder);
} else {
holder = (GroupViewHolder) layout.getTag();
}
holder.title.setText(o.title.trim());

return layout;
}

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

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

private static class GroupViewHolder {
TextView title;
ImageView image;
}

private static class ChildViewHolder {
TextView title;
}

}

我无法在根 ExpandableListView 中展开子列表;您知道在父级别扩展项目的任何正确方法吗?

我在 RootAdapter 的 getChildView 中试过:

if (groupToExpand == groupPosition && childToExpand == childPosition) {
elv.expandGroup(childToExpand);
}

然后在 Activity 中我改变了:

if (arrayList!= null && !arrayList.isEmpty()) {
RootAdapter adapter = new RootAdapter(this, arrayList);
elv.setAdapter(adapter);
// this selects the correct group, but doesn't expand the child.
elv.setSelectedChild(groupToExpand, childToExpand, true);
elv.expandGroup(groupToExpand); // this works.

adapter.groupToExpand = groupToExpand;
adapter.childToExpand = childToExpand;
adapter.notifyDataSetChanged();
}

这扩展了父级项目,但是,它生成了父级的重复项目。我该如何正确地做到这一点?这是正确的方法吗,但我的适配器坏了,因此生成了重复的项目?

我只是找不到我在这里丢失的东西...

最佳答案

我最终使用了 stackoverflow 中另一篇文章中的多级 ExpandableListView 适配器。不幸的是,我再也找不到链接了,所以我会在这里发布我的代码。

ExpandableListView 适配器的顶层。

根适配器.java:

public class RootAdapter extends BaseExpandableListAdapter {

private Object root;

private final LayoutInflater inflater;

public class Entry {
public final CustExpListview cls;
public final SecondLevelAdapter sadpt;

public Entry(CustExpListview cls, SecondLevelAdapter sadpt) {
this.cls = cls;
this.sadpt = sadpt;
}
}

public Entry[] lsfirst;

// you can change the constructor depending on which listeners you wan't to use.
public RootAdapter(Context context, Object root, ExpandableListView.OnGroupClickListener grpLst,
ExpandableListView.OnChildClickListener childLst, ExpandableListView.OnGroupExpandListener grpExpLst) {
this.root = root;
this.inflater = LayoutInflater.from(context);

lsfirst = new Entry[root.children.size()];

for (int i = 0; i < root.children.size(); i++) {
final CustExpListview celv = new CustExpListview(context);
SecondLevelAdapter adp = new SecondLevelAdapter(root.children.get(i));
celv.setAdapter(adp);
celv.setGroupIndicator(null);
celv.setOnChildClickListener(childLst);
celv.setOnGroupClickListener(grpLst);
celv.setOnGroupExpandListener(grpExpLst);

lsfirst[i] = new Entry(celv, adp);
}

}

@Override
public Object getChild(int groupPosition, int childPosition) {
return childPosition;
}

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

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
// second level list
return lsfirst[groupPosition].cls;
}

@Override
public int getChildrenCount(int groupPosition) {
return 1;
}

@Override
public Object getGroup(int groupPosition) {
return root.children.get(groupPosition);
}

@Override
public int getGroupCount() {
return root.children.size();
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {

// first level

View layout = convertView;
GroupViewHolder holder;
final Object item = (Object) getGroup(groupPosition);

if (layout == null) {
layout = inflater.inflate(R.layout.item_root, parent, false);
holder = new GroupViewHolder();
holder.title = (TextView) layout.findViewById(R.id.itemRootTitle);
layout.setTag(holder);
} else {
holder = (GroupViewHolder) layout.getTag();
}

holder.title.setText(item.title.trim());

return layout;
}

private static class GroupViewHolder {
TextView title;
}

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

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

自定义ExpandableListView,解决item有时不显示的问题。对于销毁 View 时调用 IllegalArgumentException 的已知错误,还有一个变通方法(本质上是通过按下后退按钮)。

CustExpListview.java:

public class CustExpListview extends ExpandableListView {

public CustExpListview(Context context) {
super(context);

}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// the value (2000) should not be fixed and be calculated
// as follows: cell_height x root_items_count x root_items_children_count
heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onDetachedFromWindow() {
try {
super.onDetachedFromWindow();
} catch (IllegalArgumentException e) {
// TODO: Workaround for http://code.google.com/p/android/issues/detail?id=22751
}
}
}

最后是最后一级适配器的代码。

public class SecondLevelAdapter extends BaseExpandableListAdapter {

public Object child;

public SecondLevelAdapter(Object child) {
this.child = child;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return child.children.get(groupPosition).children.get(childPosition);
}

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

// third level
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
View layout = convertView;
final Object item = (Object) getChild(groupPosition, childPosition);

ChildViewHolder holder;

if (layout == null) {
layout = inflater.inflate(R.layout.item_child, parent, false);

holder = new ChildViewHolder();
holder.title = (TextView) layout.findViewById(R.id.itemChildTitle);
layout.setTag(holder);
} else {
holder = (ChildViewHolder) layout.getTag();
}

holder.title.setText(item.title.trim());

return layout;
}

@Override
public int getChildrenCount(int groupPosition) {
return child.children.get(groupPosition).children.size();
}

@Override
public Object getGroup(int groupPosition) {
return child.children.get(groupPosition);
}

@Override
public int getGroupCount() {
return child.children.size();
}

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

// Second level
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
View layout = convertView;
ViewHolder holder;

final Object item = (Object) getGroup(groupPosition);

if (layout == null) {
layout = inflater.inflate(R.layout.item_parent, parent, false);
holder = new ViewHolder();
holder.title = (TextView) layout.findViewById(R.id.itemParentTitle);
layout.setTag(holder);
} else {
holder = (ViewHolder) layout.getTag();
}

holder.title.setText(item.title.trim());

return layout;
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
Log.d("SecondLevelAdapter", "Unregistering observer");
if (observer != null) {
super.unregisterDataSetObserver(observer);
}
}

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

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

private static class ViewHolder {
TextView title;
}

private static class ChildViewHolder {
TextView title;
}

}

希望对您有所帮助!!!

更新

这是我如何调用上述适配器的示例。

主要 Activity :

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

final List<Object> objects = yourItems;
if (!objects.isEmpty()) {
final ExpandableListView elv = (ExpandableListView) findViewById(R.id.yourExpandableListView);
/* Item click listeners below */

// First level items in the ExpandableListView
elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition,
long id) {
// TODO: whatever you need
return false /* or true depending on what you need */;
}
});

// Second level items in the ExpandableListView
ExpandableListView.OnGroupClickListener grpLst = new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition,
long id) {
// TODO: whatever you need
return false /* or true depending on what you need */;
}
};

// Third (and last) level items in the ExpandableListView
ExpandableListView.OnChildClickListener childLst = new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView eListView, View view, int groupPosition,
int childPosition, long id) {
// TODO: whatever you need
return false /* or true depending on what you need */;
}
};

ExpandableListView.OnGroupExpandListener grpExpLst = new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
/* this one is not required of course, you can delete it from the RootAdapter Constructor
* it is just an example as to how to implement Listeners on the second level items */
}
};

final RootAdapter adapter = new RootAdapter(this, objects, grpLst, childLst, grpExpLst);
elv.setAdapter(adapter);
}
}

这就是我的类 Object 的样子。

对象.java:

public class Object {
public String title; // use getters and setters instead
public List<Object> children; // same as above

public Object() {
children = new ArrayList<Object>();
}
}

关于android - 展开多级 ExpandableListView 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19298155/

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