ListFragment does not accept my layout

前端 未结 10 1274
情歌与酒
情歌与酒 2020-12-01 02:09

According to this link: ListFragment android developers

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

Here is the code:

p         


        
相关标签:
10条回答
  • 2020-12-01 02:47

    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;
    }
    
    0 讨论(0)
  • 2020-12-01 02:52

    A little bit late, but did not see this answer.

    Inside Fragment:

        @Override
        public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
                final Bundle savedInstanceState) {
            final View view = inflater.inflate(R.layout.fragment_list_activity,
                    container, false);  
    
            ListFragmentHelper.adaptView(view);
    
            return view;
        }
    

    but bear in mind that in fragment_list_activity.xml you need to set the IDs android:id="@id/loading", android:id="@id/content" and android:id="@id/empty" for your views!

    0 讨论(0)
  • 2020-12-01 02:54

    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;
    }
    
    0 讨论(0)
  • 2020-12-01 02:56

    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

    0 讨论(0)
  • 2020-12-01 02:57

    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...

    0 讨论(0)
  • 2020-12-01 02:57

    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.

    0 讨论(0)
提交回复
热议问题