Correct use of setEmtpyView in AdapterView

后端 未结 5 993
情话喂你
情话喂你 2020-12-05 00:17

I\'m really having trouble using the setEmptyView method. I tried it to implement it in GridView and ListView, but both of them didnt work. Here a sample codeblock:

相关标签:
5条回答
  • 2020-12-05 00:30

    You need to add this same view in the layout in which you have added the AdapterView.

    AdapterView only changes its visibility based on the contents in the adapter.

    EDITED :
    Following layout and code works fine :

    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <ListView
            android:layout_width="fill_parent"
            android:layout_height="300dip"
            android:id="@+id/list_view" />
        <TextView
            android:id="@+id/empty_list_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="List view is empty"
            android:visibility="gone" />
    </LinearLayout>

    Code :

    ListView listView = (ListView) findViewById( R.id.list_view );
    listView.setEmptyView( findViewById( R.id.empty_list_view ) );
    listView.setAdapter( new ArrayAdapter( this, R.layout.selected_spinner_view, new ArrayList() ) );

    0 讨论(0)
  • 2020-12-05 00:40

    Karan's answer is spot-on. The AdapterView indeed displays the empty view by merely changing its own visibility vs the empty view's visibility. However, the empty view layout does not necessarily need to be in the same XML file as that of the AdapterView. I found it useful to separate the two because I use a single layout XML file (containing a GridView) for multiple activities, but I wanted to specify different emptyView layouts for each of them.

    The key is to add the empty view to the activity with addContentView. Remember to do this after you have called setContentView specifying your main AdapterView.

    My code (in AbstractBaseActivity.onCreate) :

    View mainView = inflater.inflate(R.layout.imagegrid, null);
    GridView gridView = (GridView)mainView.findViewById(R.id.gridView);
    View emptyView = inflater.inflate(getIdOfEmptyView(), null, false);
    gridView.setEmptyView(emptyView);
    // Any additional processing on mainView
    setContentView(mainView);
    addContentView(emptyView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    

    In each child activity I override getIdOfEmptyView as follows:

    @Override
    protected int getIdOfEmptyView()
    {
        return R.layout.emptyView_Favorites;
    }
    
    0 讨论(0)
  • 2020-12-05 00:42

    PacificSky's answer got me almost to what I needed, but adding the empty view to the activity with addContentView caused the empty view to remain in the activity's container even after removing the fragment containing the ListView from the activity. Additionally, the slide in menu for the activity displayed under or mixed in with the empty view.

    The solution for me was to add the empty view to the container passed in as a parameter to the fragment's onCreateView:

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        mFragmentContainer = container;
        mListView = (ListView) mLayout.findViewById(R.id.list_view);
        mEmptyListView = inflater.inflate(R.layout.empty_list, null, false);
        container.addView(mEmptyListView);
        mListView.setEmptyView(mEmptyListView);
        mListAdapter = new MyListAdapter(getActivity(), mList);
        mListView.setAdapter(mListAdapter);
    

    And remove the empty view from the container in the fragment's onDestroyView:

    @Override
    public void onDestroyView(){
        super.onDestroyView();
        mFragmentContainer.removeView(mEmptyListView);
    }
    
    0 讨论(0)
  • 2020-12-05 00:45

    You can define external XML layout files, inflate and set it as an empty view. Only thing to remember is to set the parent of the inflated view.

    View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false);
    gridView.setEmptyView(emptyView);
    

    or

    listView.setEmptyView(emptyView);
    
    0 讨论(0)
  • 2020-12-05 00:46

    For my case, gridView.setEmptyView(emptyView) was called but it's not show the emptyview. Unless I called gridView.setVisibility(View.VISIBLE), so it appear normally;

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