【问题标题】:Expandablelistview Adapter Not Working ProperlyExpandablelistview 适配器无法正常工作
【发布时间】:2014-02-23 12:02:34
【问题描述】:

我首先在 Android 中使用 ExpandableListView 视图。我希望 groupview 在 ExpandableView 中具有不同的布局或项目。 Childs 由 spinners、textviews、edittexts 组成。

我的问题是在扩展组时,正确的布局不会膨胀,或者由于空指针异常导致代码崩溃主要导致微调。下面是一些代码示例

ExpandableListAdapter.java

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

    View v = null;
    int itemId = (int) getChildId(groupPosition, childPosition);

    if(convertView==null){
        switch (itemId) {
            case 6: convertView = li.inflate(R.layout.expand_akis,null);
                    v = akiskan(convertView);
                break;
            case 9: convertView = li.inflate(R.layout.expand_kapasite,null);
                break;
            case 11:convertView = li.inflate(R.layout.expand_kapasite2,null);
                break;
            case 12:convertView = li.inflate(R.layout.expand_evapohava,null);
                break;
            case 14:convertView = li.inflate(R.layout.expand_evapohava,null);
                break;
            case 15:
                break;
            case 18:
                break;
            default:
                break;
        }

    }
    switch (itemId) {
    case 6: v = akiskan(convertView);
        break;
    case 9: v = kapasite(convertView, childPosition);
        break;
    case 11:v = kapasite(convertView, childPosition);
        break;
    case 12:v = convertView;
        break;
    case 14:v = convertView;
        break;
    case 15:
        break;
    case 18:
        break;
    default:
        break;
    }

    return v;
}

private View kapasite(View convertView, int childPosition) {

        if(childPosition == 0){

            EditText editKapasite = (EditText)convertView.findViewById(R.id.editNumKap);

            Spinner spinKapa = (Spinner) convertView.findViewById(R.id.spinKapa);
            ArrayAdapter<CharSequence> adapKap = ArrayAdapter.createFromResource(activity, R.array.kapasiteler, 
                    R.layout.spinnertext);
            adapKap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinKapa.setAdapter(adapKap);
        }
        else if(childPosition == 1){
            EditText editYuzdePlus = (EditText)convertView.findViewById(R.id.editYuzdePlus);
            EditText editYuzdeMin  = (EditText)convertView.findViewById(R.id.editYuzdeMin);
        }

    return convertView;
}

private View akiskan(View convertView) {

    Spinner spinAkiskan = (Spinner) convertView.findViewById(R.id.spinAkis);
    ArrayAdapter<CharSequence> adapAkis = ArrayAdapter.createFromResource(activity, R.array.akiskanlar, 
            R.layout.spinnertext);
    adapAkis.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinAkiskan.setAdapter(adapAkis);

    return convertView;
}

getChildId()函数根据groupPosition和childPosition生成唯一id

main.xml

<ExpandableListView
    android:id="@+id/expandableList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/detailAraButton"
    android:layout_alignParentTop="true" />

expand_akis.xml

  <EditText
        android:layout_alignParentLeft="true"
        android:id="@+id/editNumKap"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginLeft="20dp"
        android:inputType="numberSigned" />


     <Spinner
        android:layout_toRightOf="@+id/editNumKap"
        android:layout_marginLeft="20dp"
        android:id="@+id/spinKapa"
        android:layout_width="85sp"
        android:layout_height="wrap_content"
         />

expand_kapasite.xml

 <EditText
        android:layout_alignParentLeft="true"
        android:id="@+id/editNumKap"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginLeft="20dp"
        android:inputType="numberSigned" />


     <Spinner
        android:layout_toRightOf="@+id/editNumKap"
        android:layout_marginLeft="20dp"
        android:id="@+id/spinKapa"
        android:layout_width="85sp"
        android:layout_height="wrap_content"
         />

LogCat

    02-23 14:11:21.952: E/AndroidRuntime(16384): FATAL EXCEPTION: main
02-23 14:11:21.952: E/AndroidRuntime(16384): java.lang.NullPointerException
02-23 14:11:21.952: E/AndroidRuntime(16384):    at com.buzcelik.tools.ExpandListAdapter.kapasite(ExpandListAdapter.java:105)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at com.buzcelik.tools.ExpandListAdapter.getChildView(ExpandListAdapter.java:76)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:450)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.AbsListView.obtainView(AbsListView.java:2025)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.ListView.makeAndAddView(ListView.java:1820)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.ListView.fillDown(ListView.java:672)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.ListView.fillSpecific(ListView.java:1378)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.ListView.layoutChildren(ListView.java:1651)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.AbsListView.onLayout(AbsListView.java:1876)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1589)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.View.layout(View.java:11425)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewGroup.layout(ViewGroup.java:4232)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1509)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.os.Looper.loop(Looper.java:154)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at android.app.ActivityThread.main(ActivityThread.java:4944)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at java.lang.reflect.Method.invokeNative(Native Method)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at java.lang.reflect.Method.invoke(Method.java:511)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-23 14:11:21.952: E/AndroidRuntime(16384):    at dalvik.system.NativeStart.main(Native Method)

getChild() 函数

   @Override
public long getChildId(int groupPosition, int childPosition) {
    return 2*(childPosition+3+groupPosition)+groupPosition ;
}

提前致谢!

【问题讨论】:

  • 我现在发帖@Shayanpourvatan
  • 表示ExpandListAdapter的第105行
  • spinKapa.setAdapter(adapKap);
  • 确保spinKapa id 存在于您的convertView
  • 我怎样才能确定正确的 convertView 发挥作用

标签: android android-listview expandablelistview android-adapter


【解决方案1】:

问题在于视图回收。当视图为空时,您设置一次视图。您的假设是,当将来调用该视图时,这些视图将始终提供给 getChildView。这是不正确的,一旦您折叠组,这些子视图现在有资格成为另一个位置的子视图。适配器回收它们。

有一种复杂的方法可以解决这个问题,而且方法也很简单。简单的方法是在每次调用 getChildView 时对视图进行膨胀,以便覆盖之前的视图。我认为您应该先尝试一下,这样您才能理解这是问题所在。

更复杂的方法是覆盖 getChildType() 和 getChildTypeCount() 并强制前者为您想要的每个布局返回一个唯一标识符(类似于您目前使用 getChildId 所做的),并使 getChildTypeCount 返回一个等于的值唯一布局的数量。

【讨论】:

  • 好的,我试试简单的方法,它工作得很好,我现在会尝试更复杂的方法:)
  • 好的,只要让你要覆盖的函数名称中包含“类型”即可。
  • getChildType() 函数会返回什么?它会保持默认吗
  • 一个整数,将其视为您布局的唯一标识符。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多