2014-01-24 2 views
1

FrameLayout + ListView를 사용하여 레이아웃에 DrawerLayout (지원되는 라이브러리에서)이있는 Activity가 있습니다. 내 FrameLayout이에서 나는 (함께 aprox)이처럼 보이는 ListFragment을 가지고이 예외를 throw setListAdapter onActivityCreated에서 (listAdapter) 라인 :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(); 
} 

문제에 문제가있는 것입니다

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 (기본 방법)에

무엇이 코드를 잘못 될 수 있을까? 계속 같은 오류가 있다면 내가 생각하는 다음

@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); 
} 

그리고 ListFragment 이미 inflater.inflate(com.android.internal.R.layout.list_content, container, false);

를 호출로 전체 onCreateView 방법을 제거 :

+0

이는 사용중인 클래스가 가져 오기에서 작성한 클래스와 호환되지 않음을 의미합니다. – rup35h

+2

컨테이너 매개 변수 'mListHeader = inflater.inflate (R.layout.header, null);'를 전달하지 않고 머리글과 바닥 글보기를 확대합니다. 또한 질문 제목 앞에 'Android'를 붙이지 마십시오. 하단 태그가 충분합니다. – Luksprog

+0

@Luksprog 고마워요! 그 위에 줄을 복사하고 다른 점을 찾지 않았습니다. 나는 더 조심해야합니다. Editted 질문 제목도. 원한다면 제 질문에 대한 답변으로 게시하십시오. 그래서 받아 들일 수 있습니다. – DoruAdryan

답변

1

: 당신이 당신의 현재 코드를 사용하는 경우

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

가 팽창 뷰 mListHeadermListFooterLayoutParams 인스턴스로이됩니다 FrameLayout.LayoutParams (두 번째 매개 변수로 container을 전달합니다. 두 번째 매개 변수는 기본적으로 비정상적보기가 가질 부모 유형을 제안합니다). 그러나 setListAdapter()으로 전화 할 때 ListView을 호출하면 위의보기를 반복하고 LayoutParams (ListViewAbsListView.LayoutParams의 인스턴스가 될 것으로 예상 됨)에 액세스하여 ClassCastException이되는 작업이 수행됩니다.

1

시도 대신 조각의 컨테이너의 매개 변수로 목록보기를 전달하는 MyAdapter에 문제가있을 수 있습니다.

희망이 당신을 도울 것입니다 :) 머리글과 바닥 글 사용의 코드에 대한

+0

당신의 대답은 훌륭하지만, 이것에 대한 몰락은 min API 레벨 13을 사용하도록 강요합니다. 그리고 min 9 (제 질문에서 언급하는 것을 잊어 버렸습니다)를 사용하고 싶습니다. 이 문제를 해결하기 위해 Luksprog의 조언을 사용하겠습니다. 어쨌든 귀하의 답변 주셔서 감사합니다! – DoruAdryan

+0

@DoruAdryan 글쎄, 난 문제가 보이지 않습니다. 지원 라이브러리와 함께 min api 9를 사용할 수 있습니다. 그리고 inflate 메소드의 인수로 null을 전달하지 마십시오. 못. 다음은 그 이유입니다. [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' 컨테이너'inflate()'메소드가 너무 위험해서 안드로이드 엔지니어는 SDK에 넣지 않았을 것입니다. (또는 적어도 나중에 그것을 더 이상 사용하지 마십시오.) – Luksprog