【问题标题】:java.lang.IllegalStateException: Cannot add header view to list Androidjava.lang.IllegalStateException:无法将标题视图添加到列表 Android
【发布时间】:2013-12-20 09:56:05
【问题描述】:

我的应用程序中有一个问题,我正在将标题视图动态设置为 listview,但出现以下错误,我有两个活动,A 和 B 根据我的情况我正在将标题视图设置为 listview在 A 活动中设置 headerview 它工作正常但是当 A 活动错误我的条件并转到 B 活动时我的条件为真然后来到 A 活动我需要在那里添加标题视图我得到错误............ .......我尝试添加 onStart(), onResume() 方法,但仍然遇到同样的错误.....如何解决它

Java 代码

on Strat()
{


             if (mDrawerList.getHeaderViewsCount()<1) {
             TextView headerText = new TextView(mContext);

             headerText.setGravity(Gravity.CENTER);
             headerText.setTextColor(getResources().getColor(R.color.white_color));
             headerText.setPadding(20, 12, 20, 12);
             headerText.setTextSize(18);
             headerText.setText(mSessionManager.getUserName());
             mDrawerList.addHeaderView(headerText);
             }


         adapter = new NavDrawerListAdapter(mContext, navDrawerItems);
    mDrawerList.setDividerHeight(2);

    mDrawerList.setAdapter(adapter);
    adapter.notifyDataSetChanged();

    }

错误信息

2-20 15:15:34.799: E/AndroidRuntime(13111): FATAL EXCEPTION: main
12-20 15:15:34.799: E/AndroidRuntime(13111): java.lang.RuntimeException: Unable to resume activity {com.examle.EventListActivity}: java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2790)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2819)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.os.Looper.loop(Looper.java:137)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.app.ActivityThread.main(ActivityThread.java:5103)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at java.lang.reflect.Method.invokeNative(Native Method)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at java.lang.reflect.Method.invoke(Method.java:525)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at dalvik.system.NativeStart.main(Native Method)
12-20 15:15:34.799: E/AndroidRuntime(13111): Caused by: java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.widget.ListView.addHeaderView(ListView.java:258)
12-20 15:15:34.799: E/AndroidRuntime(13111):    at android.widget.ListView.addHeaderView(ListView.java:287)

【问题讨论】:

  • Cannot add header view to list -- setAdapter has already been called. 意思是......好吧,你必须先添加标题然后 setAdapter 才能查看;]
  • 在设置适配器之前,我正在添加标题视图
  • 好像没有。您可能正在访问已设置的ListView。向我们展示更多相关代码。
  • 当你从 Activity B 回到 A 时,你是在重启 Activity A 吗?如果不是,那么它与您面临的实例相同,并且存在的列表视图已经有一个适配器集
  • stackoverflow.com/a/31181366/4489494这里试试我的回答希望这对你有帮助..

标签: android listview android-listview


【解决方案1】:

请查看addHeaderView 的文档。

特别注意注释:

注意:首次引入时,该方法只能在使用 setAdapter(ListAdapter) 设置适配器之前调用。从 KITKAT 开始,可以随时调用此方法。如果 ListView 的适配器没有扩展 HeaderViewListAdapter,它将使用 WrapperListAdapter 的支持实例进行包装。

【讨论】:

  • 我已经看到了,但是如何解决它
  • 可以使用setVisibility方法隐藏表头的视图
【解决方案2】:

我在这里找到了这个简单的解决方法http://code.neenbedankt.com/note-to-self-listfragment-and-header-views/

    @Override
    public void onDestroyView() {
      super.onDestroyView();
      setListAdapter(null);
  }

只需将其添加到 ListFragment 类。
它适用于 2.3.3 和 4.2.2

【讨论】:

    【解决方案3】:

    怎么样:

        ListAdapter adapter = listView.getAdapter();
        listView.setAdapter(null);
        listView.addHeaderView(headerView);
        listView.setAdapter(adapter);
    

    这里唯一的问题是它会重新启动您的滚动条位置。但是没有其他方法可以在设置适配器后添加 headerView。

    【讨论】:

      【解决方案4】:

      需要检查列表是否已经设置了适配器。

      if (mDrawerList.getAdapter==null) {
          // add the header view here.this will work                      
      }
      

      【讨论】:

        【解决方案5】:
        list.setAdapter(null);
        list.addHeaderView(loading.getView());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-28
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-26
          相关资源
          最近更新 更多