ExpandableListView 在每个组展开时重新组织子视图顺序

问题描述 投票:0回答:2

在我的 ExpandableListView 中,我希望每个组的第一个子项与组中的其他子项具有不同的 xml 视图。

我想要实现的目标是这样的:

enter image description here

我设法使用以下代码来做到这一点:

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View newView, ViewGroup parent) {



    if (newView==null){

        // CHILD HEADER
        if (childPosition == 0){
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            newView = infalInflater.inflate(R.layout.super_trener_cell_child_header, null);


        // CHILD CELL
        else{
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            newView = infalInflater.inflate(R.layout.super_trener_cell_child, null);
            }
    }

    return newView;
}

效果很好。 然而,有一个问题......每当我扩展和收缩单元格时,我都会得到子单元格的另一种出现顺序。

以下是一些屏幕截图,显示了正在发生的情况(数字代表它们应该出现的顺序):

enter image description here enter image description here

每次点击组标题后,单元格反转的原因可能是什么?

编辑: 整个适配器代码:

公共类 SuperTrenerCellAdapter 扩展 BaseExpandableListAdapter {

Context context;
List<SuperTrenerTopic> topics = new LinkedList<SuperTrenerTopic>();
private static LayoutInflater inflater = null;

public SuperTrenerCellAdapter(List<SuperTrenerTopic> topics, Context context) {
    this.topics = topics;
    this.context = context;
}

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

@Override
public int getChildrenCount(int groupPosition) {
    SuperTrenerTopic topic = topics.get(groupPosition);
    return topic.getLessonList().size()+1;
}

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

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

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

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

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.super_trener_cell_header, null);
    }
    SuperTrenerTopic topic = topics.get(groupPosition);
    TextView topicTitle = (TextView)convertView.findViewById(R.id.stc_topicName);
    topicTitle.setText(topic.getName());

    return convertView;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    SuperTrenerTopic topic = topics.get(groupPosition);
    if (convertView==null){

        // CHILD HEADER
        if (childPosition == 0){
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.super_trener_cell_child_header, null);


        }

        // LESSON CELL
        else{
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.super_trener_cell_child, null);
            SuperTrenerLesson stl = topic.getLessonList().get(childPosition-1);
            TextView title = (TextView)convertView.findViewById(R.id.st_cell_child_title);

            title.setText(""+stl.getTitle());

        }
    }

    return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    if (childPosition == 0){
        return false;
    }
    else{
        return true;
    }
}

}

android expandablelistview childviews
2个回答
3
投票

问题是你在getChildView中的convertView。注释掉一分钟的convertView null 检查,以便您可以看到发生了什么。

让它看起来像这样:

    @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    SuperTrenerTopic topic = topics.get(groupPosition);
    //if (convertView==null)
{

        // CHILD HEADER
        if (childPosition == 0){
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.super_trener_cell_child_header, null);


        }

        // LESSON CELL
        else{
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.super_trener_cell_child, null);
            SuperTrenerLesson stl = topic.getLessonList().get(childPosition-1);
            TextView title = (TextView)convertView.findViewById(R.id.st_cell_child_title);

            title.setText(""+stl.getTitle());

        }
    }

    return convertView;
}

当您打开和关闭标题时,它会回收视图,因此convertView可能不会返回为空,因此它使用存储的旧数据。您没有使用回收视图(convertView)设置任何新内容。您需要更改条件以适应 childView 实际回收的情况(即,convertView 不会为 null 时)。


0
投票

我经历了同样的错误操作(在片段、3级可扩展列表视图中)。在GetChildView中用双斜杠注释convertibleView调查,该过程运行良好,但它不是CPU有效的解决方案。我不清楚为什么要重新分配使用的子视图(convertView),也许有任何可能的错误。 //如果(convertView==null){ ... // }

© www.soinside.com 2019 - 2024. All rights reserved.