4

ExpandableListView使用してカスタムアダプターを使用して塗りつぶしましたBaseExpandableListAdapter。新しいアクティビティに新しいデータを追加できますが、リストを更新する必要があります。リストが更新されたときに、同じグループを展開したままにしたい。

新しいエントリは、リストの任意の場所に追加できます。新しいグループまたは新しい子だけを追加できます。

今私は使用しています:

adapter.notifyDataSetChanged();

リストは更新されますが、状態は同じではありません。たとえば、G1 展開、G2 展開なし、G3 展開の 3 つのグループがある場合、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;
}
}

私の活動では、これを行います:

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();
    }

}
4

1 に答える 1

2

安定したExpandableListViewID を使用していないため、 が正しく再展開されません。安定した ID を使用すると、問題が解決されます。

ここで安定したIDを有効にしましたが:

public boolean hasStableIds() {
    return true;
}

getGroupId()およびメソッドを使用して、実際に安定した ID を返す必要がありgetChildId()ます。groupPositionと をそれぞれ返すことはchildPosition、安定した ID とは見なされません。

安定した ID であるということは、返される値がデータ セット全体で一意であることを意味します。さらに、返される値は、特定のアイテムの位置に関係なく同じになります。たとえば、People を格納しているとします。誰もが固有の SSN を持っています。これは、 で返される優れた安定した IDgetChildId()です。たとえば、John Smith が位置 2、4 (グループ、子) にあり、その後位置 (3、1) に移動した場合...彼の安定した ID (または SSN) は同じままです。位置番号のみを返すことは、これを保証できません。

于 2015-02-14T01:28:32.117 に答える