Domanda

Sono davvero problemi con il metodo setEmptyView. Ho provato per la sua attuazione in GridView e ListView, ma entrambi lavoro non ha ancora. Ecco un codeblock campione:

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

La scheda di rete non contiene elementi:

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

    }

Ho anche provato a chiamare networkGames.setAdapter (null), ma questo non funziona neanche. Il mio aspetto emtpyView come questo:

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

Io davvero non so cosa sto facendo male. Ho letto anche vari tutorial, ma nessuno di loro metnioned eventuali problemi.

È stato utile?

Soluzione

È necessario aggiungere questo stesso punto di vista nel layout in cui è stato aggiunto l'AdapterView.

AdapterView cambia solo la sua visibilità in base al contenuto della scheda.

Modificato:
A seguito di layout e codice funziona bene:


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

Codice:

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

Altri suggerimenti

La risposta di Karan è spot-on. L'AdapterView mostra infatti la vista vuoto, semplicemente cambiando la propria visibilità vs visibilità della vista vuoto. Tuttavia, il layout di visualizzazione vuota non deve necessariamente essere nello stesso file XML come quella del AdapterView. Ho trovato utile per separare i due, perché io uso un file singolo layout XML (contenente un GridView) per molteplici attività, ma ho voluto specificare diversi layout emptyView per ciascuno di essi.

La chiave è quello di aggiungere la vista vuoto all'attività con addContentView. Ricordatevi di fare questo dopo vi ho chiamati setContentView specificando l'AdapterView principale.

Il mio codice (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 ogni attività bambino sovrascrivo getIdOfEmptyView come segue:

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

È possibile definire file di layout XML esterni, gonfiare e impostarlo come una vista vuota. L'unica cosa da ricordare è quello di impostare il genitore della vista gonfiato.

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

o

listView.setEmptyView(emptyView);

La risposta di PacificSky mi ha fatto quasi a quello che mi serviva, ma aggiungendo la vista vuoto per l'attività con addContentView causato la vista vuoto per rimanere nel contenitore della propria attività anche dopo la rimozione del frammento che contiene il ListView dall'attività. Inoltre, il vetrino in menù per l'attività visualizzato sotto o mista con vista vuoto.

La soluzione per me è stato quello di aggiungere la vista vuoto al contenitore passato come parametro al onCreateView del frammento:

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

E rimuovere la vista vuoto dal contenitore nel onDestroyView del frammento:

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

Per il mio caso, gridView.setEmptyView (emptyView) è stato chiamato ma non è mostrare l'emptyview. A meno che non ho chiamato gridView.setVisibility (View.VISIBLE), in modo da farlo apparire normalmente;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top