Frage

Ich habe wirklich Probleme mit der setEmptyView Methode. Ich versuchte es es in Gridview und Listview zu implementieren, aber beide nicht funktioniert. Hier ist ein Beispiel Codeblock:

 networkGames = (GridView) baseLayer.findViewById(R.id.all_game_grid_network);
 networkGames.setBackgroundResource(R.drawable.game_border);
 networkGames.setSelector(R.drawable.game_active_border);
 networkGames.setOnItemClickListener(new NetworkGameListener());
 networkGames.setEmptyView(View.inflate(baseLayer, R.drawable.no_network_games, null));
 networkGames.setAdapter(new NetworkAdapter());

Der Netzwerkadapter enthält noch keine Artikel:

private class NetworkAdapter extends BaseAdapter {

        /* (non-Javadoc)
         * @see android.widget.Adapter#getCount()
         */
        @Override
        public int getCount() {
            return 0;
        }

        /* (non-Javadoc)
         * @see android.widget.Adapter#getItem(int)
         */
        @Override
        public Object getItem(int position) {
            return null;
        }

        /* (non-Javadoc)
         * @see android.widget.Adapter#getItemId(int)
         */
        @Override
        public long getItemId(int position) {
            return 0;
        }

        /* (non-Javadoc)
         * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }

    }

Ich habe auch versucht networkGames.setAdapter (null) zu nennen, aber dies nicht funktioniert entweder. Meine emtpyView sieht wie folgt aus:

<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
    android:text="There are currently no network games available. Start a new one."
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center">
    </TextView>
</LinearLayout>

Ich weiß wirklich nicht, was ich falsch mache. Ich lese auch verschiedene Tutorials, aber keiner von ihnen metnioned Probleme.

War es hilfreich?

Lösung

Sie müssen diese gleiche Ansicht im Layout hinzuzufügen, in dem Sie die AdapterView hinzugefügt haben.

AdapterView ändert nur ihre Sichtbarkeit auf der Basis der Inhalte in den Adapter.

EDITED:
Im Anschluss an das Layout und Code funktioniert gut:


<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() ) );

Andere Tipps

Karan Antwort ist spot-on. Die AdapterView in die Tat zeigt die leere Ansicht lediglich durch seine eigene Sicht gegen die leere Ansicht Sichtbarkeit zu ändern. Allerdings ist das leere View-Layout nicht unbedingt wie die der AdapterView in derselben XML-Datei sein. Ich fand es sinnvoll, die beiden zu trennen, weil ich ein einzelnes Layout XML-Datei verwenden für mehrere Aktivitäten (ein Gridview enthält), aber ich wollte verschiedene emptyView Layouts für jeden von ihnen angeben.

Der Schlüssel ist der leeren Blick auf die Aktivität mit addContentView hinzuzufügen. Denken Sie daran, dies zu tun nach Sie haben Ihr Haupt AdapterView genannt setContentView angeben.

Mein 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 jedem Kind Aktivität I getIdOfEmptyView außer Kraft setzen, wie folgt:

@Override
protected int getIdOfEmptyView()
{
    return R.layout.emptyView_Favorites;
}

Sie können die externen XML-Layout-Dateien definieren, aufblasen und es als eine leere Ansicht verwenden. Nur daran zu denken, die Eltern der aufgeblasenen Ansicht eingestellt werden.

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

oder

listView.setEmptyView(emptyView);

PacificSky Antwort hat mich fast zu dem, was ich brauchte, aber das Hinzufügen der leere Blick auf die Aktivität mit addContentView verursacht den leeren Blick in die Tätigkeit des Behälters bleiben auch nach dem Fragment Entfernen der Listview aus der Tätigkeit enthalten. Darüber hinaus zeigte die Folie in Menü für die Aktivität unter oder gemischt mit dem leeren Blick.

Die Lösung war für mich den leeren Blick auf den Container in als Parameter an das onCreateView fragmente weitergegeben hinzuzufügen:

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

und entfernen Sie den leeren Blick aus dem Behälter in die onDestroyView fragment:

@Override
public void onDestroyView(){
    super.onDestroyView();
    mFragmentContainer.removeView(mEmptyListView);
}

Für meinen Fall gridView.setEmptyView (emptyView) genannt wurde, aber es die emptyview nicht zeigen wird. Es sei denn, ich gridView.setVisibility (View.VISIBLE) genannt wird, so erscheint es normal;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top