2014-01-24 2 views
1

У меня есть активность, в которой в макете содержится DrawerLayout (из поддерживаемой библиотеки) с помощью FrameLayout + ListView. В моей FrameLayout у меня есть ListFragment, который выглядит следующим образом (приблиз):ListFragment setListAdapter

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View fragmentView = inflater.inflate(R.layout.fragment_post, 
      container, false); 

    mListHeader = inflater.inflate(R.layout.header, 
      container, false); 
    mListFooter = inflater.inflate(R.layout.footer, 
      container, false); 

    // inflate xml layout into Views 
    linkUI(); 

    // set Views actions 
    setAction(); 

    return fragmentView; 

} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // add header and footer before settings adapter (to work in 
    // pre-KITKAT versions) 
    getListView().addHeaderView(mListHeader); 
    getListView().addFooterView(mListFooter); 

    if (listAdapter == null) { 
     listAdapter = new MyAdapter(getActivity()); 
    } 

    setListAdapter(listAdapter); 
    pbListLoading.setVisibility(View.VISIBLE); 

} 

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

Проблема, кажется, есть проблема в: setListAdapter (listAdapter) линия от onActivityCreated, что бросает это исключение:

01-24 18:20:55.336: E/AndroidRuntime(20789): FATAL EXCEPTION: main 
01-24 18:20:55.336: E/AndroidRuntime(20789): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.widget.ListView.clearRecycledState(ListView.java:519) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.widget.ListView.resetList(ListView.java:505) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.widget.ListView.setAdapter(ListView.java:448) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.ListFragment.setListAdapter(ListFragment.java:182) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at com.example.PostFragment.onActivityCreated(PostFragment.java:138) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.os.Handler.handleCallback(Handler.java:615) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.os.Looper.loop(Looper.java:153) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at android.app.ActivityThread.main(ActivityThread.java:5006) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at java.lang.reflect.Method.invokeNative(Native Method) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at java.lang.reflect.Method.invoke(Method.java:511) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 
01-24 18:20:55.336: E/AndroidRuntime(20789): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 

01-24 18: 20: 55,336: E/AndroidRuntime (20789): в dalvik.system.NativeStart.main (Native Method)

Что может быть не так с этим кодом?

+0

это означает, что класс, который вы используете, несовместим с тем, что вы написали в импорте. – rup35h

+2

Надуйте представления верхнего и нижнего колонтитулов, не передавая параметр контейнера, 'mListHeader = inflater.inflate (R.layout.header, null);' например. Кроме того, пожалуйста, не приписывайте заголовок вашего вопроса «Android», ярлык на дне более чем достаточно. – Luksprog

+0

@Luksprog Большое спасибо! скопировали строку над ними и не искали различий. Я постараюсь быть более осторожным. Изменено название вопроса. Если хотите, разместите его как ответ на мой вопрос, чтобы я мог его принять. – DoruAdryan

ответ

1

Для кода использования колонтитулов:

mListHeader = inflater.inflate(R.layout.header, null); 
mListFooter = inflater.inflate(R.layout.footer, null); 

Если вы используете ваш текущий код завышенных просмотры mListHeader и mListFooter будут иметь в качестве LayoutParams экземпляра FrameLayout.LayoutParams (вы передаете container в качестве второго параметра, который в основном предполагает тип родителя, который будет иметь раздутые представления). Однако, когда вы вызываете setListAdapter(), ListView выполняет некоторые работы под капотом, где он будет перебирать приведенные выше виды и получать доступ к их LayoutParams (который ListView ожидает быть экземпляром AbsListView.LayoutParams), что приводит к ClassCastException.

1

Попробуйте пройти ListView в качестве параметра вместо контейнера фрагмента:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mListHeader = inflater.inflate(R.layout.header, view, false); 
    mListFooter = inflater.inflate(R.layout.footer, view, false); 
} 

И удалить весь onCreateView метод как ListFragment уже называет inflater.inflate(com.android.internal.R.layout.list_content, container, false);

Если у вас есть такая же ошибка, то я думаю, у вас может возникнуть проблема в вашем MyAdapter.

Надеется, что это поможет :)

+0

Я вижу, что ваш ответ отлично работает, но падение к этому заставляет меня использовать min api level 13, и я бы хотел использовать min 9 (забыл упомянуть об этом в моем Вопросе). Я воспользуюсь советом Luksprog, чтобы решить эту проблему. Спасибо за ваш ответ! – DoruAdryan

+0

@DoruAdryan ну, я не вижу проблемы. Вы можете использовать min api 9 с библиотекой поддержки. И не передайте null в качестве аргумента для метода inflate. НИКОГДА. Вот почему [http://www.doubleencore.com/2013/05/layout-inflation-as-intended/](http://www.doubleencore.com/2013/05/layout-inflation-as-intended/) – AMerle

+0

@CFlex NEVER - сильное утверждение. В большинстве случаев передача контейнера действительно разумная вещь, но вы также можете использовать «null», если вы понимаете сценарий, в котором вы используете его, и процесс раздувания. И если метод 'null' container' inflate() 'был настолько опасен, что инженеры Android не поместили бы его в SDK (или, по крайней мере, уменьшили бы его в более поздней точке). – Luksprog

Смежные вопросы