ListFragment does not accept my layout

According to this link: ListFragment android developers

I want to set my custom layout for list, but it makes exceptions.

  • IncompatibleClassChangeError after updating to Android Build Tools 25.1.6 GCM / FCM
  • Scale background image in LinearLayout
  • Facebook Sdk Has Not Been Initilized
  • How to implement Flipboard ipad page turning animation for view flipper in android?
  • Out of memory on a byte allocation (Bitmap as String to webservice using soap)
  • find out which activity started my activity?
  • Here is the code:

    public class ListFragmentActivity extends FragmentActivity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        FragmentManager fm = getSupportFragmentManager();
        if(fm.findFragmentById(android.R.id.content) == null)
        {
            myListFragments list = new myListFragments();
            fm.beginTransaction().add(android.R.id.content, list).commit();
        }
    }
    
    public static class myListFragments extends ListFragment
    {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.topoffers, container, false);
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onActivityCreated(savedInstanceState);
            List<OfferModel> offers = Global.getInstance().getOffers();
            List<OfferModel> topOffers = new ArrayList<OfferModel>(4);
            for (int i = 0; i < 4; i++) {
                if (offers.get(i).getOfferImage() == null)
                    offers.get(i).setOfferImage(
                            downloadFile(offers.get(i).getOfferImageUrl()));
                topOffers.add(offers.get(i));
            }
            LazyAdapter adapter = new LazyAdapter(getActivity());
            adapter.setData(topOffers);
            setListAdapter(adapter);
            setListShown(true);
        }
    
        public Bitmap downloadFile(String fileUrl) {
            URL myFileUrl = null;
            try {
                myFileUrl = new URL(fileUrl);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }
            try {
                HttpURLConnection conn = (HttpURLConnection) myFileUrl
                        .openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream is = conn.getInputStream();
                return BitmapFactory.decodeStream(is);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }}
    

    and my custom layout is R.layout.topoffers

    Logcat:

     05-15 21:43:56.975: W/dalvikvm(218): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
     05-15 21:43:56.975: E/AndroidRuntime(218): Uncaught handler: thread main exiting due to uncaught exception
     05-15 21:43:56.995: E/AndroidRuntime(218): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.anddev.android.ikiwi/org.anddev.android.ikiwi.ListFragmentActivity}:
        java.lang.IllegalStateException: Can't be used with a custom content view 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.os.Handler.dispatchMessage(Handler.java:99) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.os.Looper.loop(Looper.java:123) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread.main(ActivityThread.java:4363) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at java.lang.reflect.Method.invokeNative(Native Method) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at java.lang.reflect.Method.invoke(Method.java:521) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at dalvik.system.NativeStart.main(Native Method) 
     05-15 21:43:56.995: E/AndroidRuntime(218): Caused by: java.lang.IllegalStateException:
        Can't be used with a custom content view 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.ListFragment.setListShown(ListFragment.java:282)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.ListFragment.setListShown(ListFragment.java:258)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at org.anddev.android.ikiwi.ListFragmentActivity$myListFragments.onActivityCreated(ListFragmentActivity.java:57)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:891)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.Activity.performStart(Activity.java:3723) 
     05-15 21:43:56.995: E/AndroidRuntime(218):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468)
     05-15 21:43:56.995: E/AndroidRuntime(218):     ... 11 more 
     05-15 21:43:57.025: I/dalvikvm(218): threadid=7: reacting to signal 3 
     05-15 21:43:57.025: E/dalvikvm(218): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
    

    Related posts:

    How can I catch SIGSEGV (segmentation fault) and get a stack trace under JNI on Android?
    ADT 21 update not recognized by Eclipse
    Uninstalling APK : one last action before uninstall
    navigation drawer google maps v2 , map blocking drawer
    Save custom object array in instance state
    Where to I place the OBB file to test Android Expansion Pack Files (OBB) on my Nexus 4?
  • Recursive entry to executePendingTransactions
  • Android AsyncTask threads limits?
  • I am getting an error “The method show(FragmentManager, String)”
  • StackOverflow error Android/Eclipse
  • Is there a way to add Extras to Activity using ActivityInstrumentationTestCase2
  • ExpandableListView - keep selected child in a “pressed” state
  • 9 Solutions collect form web for “ListFragment does not accept my layout”

    This sounds like an issue that’s been reported to Google already.

    Google Issue

    If this is indeed your issue, there’s a couple of suggestions at the bottom of that page for fixing it (well, more making it work than fixing it).

    Create the layout file list_content.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        <LinearLayout android:id="@+id/progressContainer"
                android:orientation="vertical"
                android:layout_width="match_parent" 
                android:layout_height="match_parent"
                android:visibility="gone"
                android:gravity="center">
    
            <ProgressBar style="?android:attr/progressBarStyleLarge"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            <TextView android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text=""
                    android:paddingTop="4dip"
                    android:singleLine="true" />
    
        </LinearLayout>
    
        <FrameLayout android:id="@+id/listContainer"
                android:layout_width="match_parent" 
                android:layout_height="match_parent">
    
            <ListView android:id="@android:id/list"
                    android:layout_width="match_parent" 
                    android:layout_height="match_parent"
                    android:drawSelectorOnTop="false" />
            <TextView android:id="@+id/internalEmpty"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
        </FrameLayout>
    
    </FrameLayout>
    

    Put this inside your ListFragment class:

    public ListView mList;
    boolean mListShown;
    View mProgressContainer;
    View mListContainer;
    
    public void setListShown(boolean shown, boolean animate){
        if (mListShown == shown) {
            return;
        }
        mListShown = shown;
        if (shown) {
            if (animate) {
                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
                        getActivity(), android.R.anim.fade_out));
                mListContainer.startAnimation(AnimationUtils.loadAnimation(
                        getActivity(), android.R.anim.fade_in));
            }
            mProgressContainer.setVisibility(View.GONE);
            mListContainer.setVisibility(View.VISIBLE);
        } else {
            if (animate) {
                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
                        getActivity(), android.R.anim.fade_in));
                mListContainer.startAnimation(AnimationUtils.loadAnimation(
                        getActivity(), android.R.anim.fade_out));
            }
            mProgressContainer.setVisibility(View.VISIBLE);
            mListContainer.setVisibility(View.INVISIBLE);
        }
    }
    public void setListShown(boolean shown){
        setListShown(shown, true);
    }
    public void setListShownNoAnimation(boolean shown) {
        setListShown(shown, false);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        int INTERNAL_EMPTY_ID = 0x00ff0001;
        View root = inflater.inflate(R.layout.list_content, container, false);
        (root.findViewById(R.id.internalEmpty)).setId(INTERNAL_EMPTY_ID);
        mList = (ListView) root.findViewById(android.R.id.list);
        mListContainer =  root.findViewById(R.id.listContainer);
        mProgressContainer = root.findViewById(R.id.progressContainer);
        mListShown = true;
        return root;
    }
    

    Now you can use normally:

    setListShown(boolean shown);
    setListShown(boolean shown, boolean animate);
    setListShownNoAnimation(boolean shown);
    

    Source:

    http://source-android.frandroid.com/frameworks/base/core/java/android/app/ListFragment.java

    http://source-android.frandroid.com/frameworks/base/core/res/res/layout/list_content.xml

    This might be easier:
    Create your layout as you would normally but don’t add the list/empty/loading stuff. Then in your listfragment’s onCreateView:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = super.onCreateView(inflater, container, savedInstanceState);
        ViewGroup parent = (ViewGroup) inflater.inflate(R.layout.mylayout, container, false);
        parent.addView(v, 0);
        return parent;
    }
    

    Now you can use setListShown…

    Just replace the original ListView with your CustomListView Layout within the onCreateView method. Worked for me.

        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View layout = super.onCreateView(inflater, container,
                savedInstanceState);
        ListView lv = (ListView) layout.findViewById(android.R.id.list);
        ViewGroup parent = (ViewGroup) lv.getParent();
    
        // Remove ListView and add CustomView  in its place
        int lvIndex = parent.indexOfChild(lv);
        parent.removeViewAt(lvIndex);
        LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(
                R.layout.custom_list, container, false);
        parent.addView(mLinearLayout, lvIndex, lv.getLayoutParams());
        return layout;
    }
    

    Today I had the same issue. Looking the solution in Google, I found a post in a japanese blog. (http://blog.nkzn.net/entry/2012/06/14/160706).

    For use setListShown(boolean) you must do first in your layout:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
        </FrameLayout>
    
        <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:visibility="gone" >
    
        <ProgressBar
            android:id="@android:id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        </LinearLayout>
    </RelativeLayout>
    

    Now in your ListFragment:

    public class SampleListFragment extends ListFragment {
    
      /** ID for progressbar parent */
      private static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002;
      /** ID for listview parent */
      private static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003;
    
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.custom_list_layout, container, false);
    
        // get you progressBar and his parent
        ProgressBar pBar = (ProgressBar) view.findViewById(android.R.id.progress);
        LinearLayout pframe = (LinearLayout) pBar.getParent();
        pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
    
        ListView listView = (ListView) view.findViewById(android.R.id.list);
        listView.setItemsCanFocus(false);
        FrameLayout lFrame = (FrameLayout) listView.getParent();
        lFrame.setId(INTERNAL_LIST_CONTAINER_ID);    
    
        return view;
      } 
    }
    

    with this 2 ids numbers seted in his parents setListShown(boolean) will work without problems.

    Another solution that worked for me as well is just to put this line

    <include layout="@android:layout/list_content" />
    

    instead of your list view.

    You are able to build your own content on top of it or surround it with some other views. For example, here is how my layout looks like:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="@dimen/default_view_padding"
            android:gravity="center"
            android:weightSum="4">
    
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/btnCounterBack"
                android:src="?attr/ic_previous"
                android:background="?android:attr/selectableItemBackground"
                android:contentDescription="@null"/>
    
        <TextView
                android:id="@+id/tvCounterLevel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="@string/counter_categories"
                android:layout_gravity="center"
                android:paddingTop="@dimen/default_view_padding"
                android:paddingBottom="@dimen/default_view_padding"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:gravity="center"/>
    
    </RelativeLayout>
    
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:background="?attr/dropShadowBackground"
            android:orientation="vertical" >
    
        <include layout="@android:layout/list_content" />
    
    </LinearLayout>
    

    I just needed to change my empty text TextView properties and did this

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        // Swap the new cursor in. (The framework will take care of closing the
        // old cursor once we return)
        mAdapter.swapCursor(cursor);
        if (cursor.getCount() == 0) {
            setEmptyText(getString(R.string.no_users));
            TextView tvEmpty = (TextView) getListView().getEmptyView();
            tvEmpty.setTextColor(getResources().getColor(R.color.blue));
        }
        // The list should now be shown.
        if (isResumed()) {
            setListShown(true);
        } else {
            setListShownNoAnimation(true);
        }
    }
    

    Do not forget that if you try initializing tvEmpty before you call setEmptyText("Empty"), you’ll run into a NullPointerException

    This code worked for me:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = super.onCreateView(inflater, container, savedInstanceState);
    
        ((TextView)root.findViewById(0x00ff0001)).setText("some text");
    
        ListView list = (ListView) root.findViewById(android.R.id.list);
        list.setEmptyView(root.findViewById(0x00ff0001));
    
        return root;
    }
    

    Try to remove setListShown(true);?

    I had same problem, some time ago.
    It’s seams that you cant use it if you have custom layout in ListFragment.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.