gpt4 book ai didi

android - 添加数据时刷新ExpandableListView : keep state

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:10 27 4
gpt4 key购买 nike

我有一个使用 BaseExpandableListAdapter 的自定义适配器填充的 ExpandableListView。我可以在新 Activity 中添加新数据,然后我必须刷新列表。刷新列表时,我想保持相同的组展开。

可以在列表中的任何位置添加新条目。我们可以添加新的组或只是新的 child 。

现在我正在使用:

adapter.notifyDataSetChanged();

列表刷新了,但是状态不一样了。例如,如果我有三个组:G1 展开、G2 未展开、G3 展开,并且我在 G2 和 G3 之间添加了一个新组 G4,那么 G4 获得 G3 状态,因为它占据了它的位置。有什么方法可以自动保持状态,还是我必须在我的适配器中手动进行?

谢谢!

[编辑]

添加一些代码。

这是我的适配器:

public class StopsInnerExpandableListAdapter extends BaseExpandableListAdapter {

private ArrayList<String> groups; // Dates.
private ArrayList<ArrayList<HashMap<String, String>>> children; // HashMap has stop ID, image and price.
private Context context;

public StopsInnerExpandableListAdapter (Context ctx, ArrayList<String> groups,
ArrayList<ArrayList<HashMap<String, String>>> children) {
context = ctx;
this.groups = groups;
this.children = children;
}

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

public HashMap<String, String> getChild(int groupPosition, int childPosition) {
return children.get(groupPosition).get(childPosition);
}

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

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
// Inflate child's view.
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.stop_row, null);
}

// Get the stop data and use it to fill the child's views.
HashMap<String, String> child = children.get(groupPosition).get(childPosition);

...

return convertView;
}

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

public String getGroup(int groupPosition) {
return groups.get(groupPosition);
}

public int getGroupCount() {
return groups.size();
}

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

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
// Inflate group's view.
LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.stop_subgroup, null);
}

String date = groups.get(groupPosition);

TextView dateView = (TextView) convertView.findViewById(R.id.title_date);
dateView.setText(date);

return convertView;
}

public boolean hasStableIds() {
return true;
}

public boolean isChildSelectable(int arg0, int arg1) {
return true;
}

public void updateData(ArrayList<String> groups,
ArrayList<ArrayList<HashMap<String, String>>> children) {
this.groups = groups;
this.children = children;
}
}

在我的 Activity 中我这样做:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stop_list);

mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list);

model = new MyModel(this);
}

@Override
protected void onResume() {
super.onResume();

ListEntries entries = model.getEntries();

if(adapter == null){
// Sets the adapter that provides data to the list.
adapter = new StopsInnerExpandableListAdapter(this, entries.getDates(), entries.getChilds());
mExpandableList.setAdapter(adapter);
}
else{
adapter.updateData(entries.getDates(), entries.getChilds());
adapter.notifyDataSetChanged();
}

}

最佳答案

ExpandableListView 没有正确重新展开,因为您没有使用稳定的 ID。使用稳定的 ID 将为您解决问题。

虽然您确实通过此处启用了稳定 ID:

public boolean hasStableIds() {
return true;
}

您仍然需要使用 getGroupId()getChildId() 方法实际返回稳定的 ID。分别返回 groupPositionchildPosition 不符合稳定 ID 的条件。

成为稳定的 ID 意味着返回的值在整个数据集中是唯一的。此外,无论给定项目的位置如何,返回的值都是相同的。例如,假设您正在存储人员。每个人都有唯一的 SSN。这将是一个很好的稳定 ID,可以用 getChildId() 返回。例如,如果 John Smith 位于位置 2、4(组、 child ),然后移动到位置(3、1)...他的稳定 ID(或 SSN)仍将相同。仅返回位置编号并不能保证这一点。

关于android - 添加数据时刷新ExpandableListView : keep state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064676/

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