具有多个布局的ExpandableListView

itc*_*pra 4 android expandablelistview expandablelistadapter android-layout

我为我的英语道歉,但用谷歌翻译.我需要帮助我的应用程序,我使用具有3种不同布局的ExpandableListView但我遇到了问题,我没有在各种论坛上找到答案.基本上,如果方法getChildView()检查convertView是否为null,我会偏移所有布局,甚至我多次重复它们.如果我没有进行检查,你会看到它应该的布局,但如果我点击另一个组或者你没有用EditText来显示布局,那么EditText中的值会被删除.我希望我足够清楚,我希望答案同样清楚,不幸的是我一直在互联网上,但找不到我想要的答案.在此先感谢那些会帮助我的人

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

            View view = convertView;
            ViewHolder holder;

            if (view == null) {
                    holder = new ViewHolder();

                    if (groupPosition == 0) {
                            convertView = infalInflater.inflate(R.layout.adv_item, null);
                            holder.btn1 = (ImageButton) convertView
                                            .findViewById(R.id.button1);
                            holder.btn2 = (ImageButton) convertView
                                            .findViewById(R.id.button2);
                            holder.btn3 = (ImageButton) convertView
                                            .findViewById(R.id.button3);
                            holder.et1 = (EditText) convertView.findViewById(R.id.editText1);
                            holder.et2 = (EditText) convertView.findViewById(R.id.editText2);
                            holder.et3 = (EditText) convertView.findViewById(R.id.editText3);
                            holder.et4 = (EditText) convertView.findViewById(R.id.editText4);
                            holder.et5 = (EditText) convertView.findViewById(R.id.editText5);
                            holder.et6 = (EditText) convertView.findViewById(R.id.editText6);
                            holder.check_sc1 = (CheckBox) convertView
                                            .findViewById(R.id.item_check_sc1);
                            holder.check_sc2 = (CheckBox) convertView
                                            .findViewById(R.id.item_check_sc2);
                            holder.check_sc3 = (CheckBox) convertView
                                            .findViewById(R.id.item_check_sc3);
                            holder.check_oo = (CheckBox) convertView
                                            .findViewById(R.id.item_check_oo);
                            convertView.setTag(holder);
                    }
                    if (groupPosition == 1) {
                            convertView = infalInflater.inflate(R.layout.visual_item, null);
                    }
                    if (groupPosition == 2) {
                            convertView = infalInflater.inflate(R.layout.routes_item, null);
                    }
            } else {
                    holder = (ViewHolder) convertView.getTag();
            }
            return convertView;
    }
Run Code Online (Sandbox Code Playgroud)

myk*_*laj 13

现在你的列表并不"知道"它有三种不同类型的记录.您需要通过覆盖适配器的下一个功能来"告诉"它:

@Override
public int getViewTypeCount() {
    return 3;     // <-- Here goes your view types count
}
Run Code Online (Sandbox Code Playgroud)

您还需要覆盖Adapter的函数以确定要使用的视图类型:

@Override
public int getItemViewType(int position) {
    return getItemViewType(position);  // <-- Here must be your logic to get the type of the item
}
Run Code Online (Sandbox Code Playgroud)

所以现在Android有一个可以使用的三种类型的列表项池.现在你不需要'if(groupPosition == 2)'(等等),因为ListView将使用这些函数来确定正确的布局以传递到适配器的'getView()'函数.以上适用于简单的ListAdapters.

至于ExpandableAdapters,它们具有类似的功能:

public int getGroupTypeCount ()
public int getGroupType (int groupPosition)
public int getChildType (int groupPosition, int childPosition)
public int getChildTypeCount ()
Run Code Online (Sandbox Code Playgroud)

您需要覆盖所有这些或其中一些,具体取决于您是否对组使用不同的布局.至于你的情况,我建议尝试类似的东西:

@Override
public int getChildTypeCount () {
    return 3;   <-- you have three types of views
}

@Override
public int getChildType (int groupPosition, int childPosition) {
    /*
     * In case of group 1 this function returns 1,
     * in case of group 2 it returns 2, and so on.
     */
    return groupPosition;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人在找不到方法时对此有点困惑,那么不是具有这些方法的ExpandableListAdapter接口,而是实现接口的BaseExpandableListAdapter类,您可以扩展 (5认同)