studio setonitemclicklistener recyclerview que onclickitemlistener long adapterview android android-adapterview

android - setonitemclicklistener - Uso correcto de setEmtpyView en AdapterView



recyclerview android (4)

Realmente estoy teniendo problemas para usar el método setEmptyView. Intenté implementarlo en GridView y ListView, pero ninguno de los dos funcionó. Aquí un ejemplo de bloque de código:

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

El adaptador de red no contiene elementos:

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

También intenté llamar a networkGames.setAdapter (null), pero tampoco funciona. Mi emtpyView se ve así:

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

Realmente no sé lo que estoy haciendo mal. También leí varios tutoriales, pero ninguno de ellos resolvió ningún problema.


Debe agregar esta misma vista en el diseño en el que ha agregado AdapterView.

AdapterView solo cambia su visibilidad en función del contenido del adaptador.

EDITADO:
El siguiente diseño y código funciona bien:

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

Código:

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


La respuesta de Karan es acertada. De hecho, AdapterView muestra la vista vacía simplemente cambiando su propia visibilidad frente a la visibilidad de la vista vacía. Sin embargo, el diseño de la vista vacía no necesariamente debe estar en el mismo archivo XML que el de AdapterView. Encontré útil separar los dos porque utilizo un único archivo XML de diseño (que contiene un GridView) para múltiples actividades, pero quería especificar diferentes diseños de EmptyView para cada uno de ellos.

La clave es agregar la vista vacía a la actividad con addContentView. Recuerde hacer esto después de haber llamado a setContentView especificando su AdapterView principal.

Mi código (en 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));

En cada actividad secundaria anulo getIdOfEmptyView de la siguiente manera:

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


La respuesta de PacificSky me dio casi lo que necesitaba, pero agregar la vista vacía a la actividad con addContentView hizo que la vista vacía permaneciera en el contenedor de la actividad incluso después de eliminar el fragmento que contiene ListView de la actividad. Además, la diapositiva en el menú para la actividad mostrada debajo o mezclada con la vista vacía.

La solución para mí fue agregar la vista vacía al contenedor pasado como un parámetro al onCreateView del fragmento:

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

Y elimine la vista vacía del contenedor en onDestroyView del fragmento:

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


Puede definir archivos de diseño XML externos, inflarlos y configurarlos como una vista vacía. Lo único que debe recordar es configurar el elemento primario de la vista inflada.

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

o

listView.setEmptyView(emptyView);