Pregunta

Me estoy sacando el cabello tratando de resolver esto. De todos los tutoriales que he leído, la forma en que tengo esta configuración debería funcionar. Tengo una Actividad de ListActividad que está utilizando un adaptador personalizado para mostrar algunos datos. Me gustaría mostrar un mensaje "sin elementos encontrados" si el adaptador está vacío.

Este es mi diseño:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 style="@style/BaseStyle"
 android:orientation="vertical"
 android:padding="5dip"
 >
      <ListView android:id="@android:id/list"
      style="@style/BaseStyle"
      />

      <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/empty"
      style="@style/BaseStyle.Title"
      android:text="No Items Found"
      />

      <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/text"
      style="@style/BaseStyle.Title"
      android:layout_alignParentTop="true"
      />
 </RelativeLayout>

Este es mi código:

 public class Main extends ListActivity {
 private CustomAdapter adapter;
 private String[] items = {};

 @Override     
 public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      setContentView(R.layout.main);

      adapter = new CustomAdapter();

      PopulateItems();

      for (String item : items)
           adapter.addItem(item);

      this.setListAdapter(adapter);
      adapter.notifyDataSetChanged();
 }

 private class CustomAdapter extends BaseAdapter {
 private String[] mData;
 private LayoutInflater mInflater;

 public CustomAdapter() {
      mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 public void addItem(String item) {
      mData.add(item);
 }

 @Override
 public int getCount() {
      return mData.size();
 }

 @Override
 public Object getItem(int position) {
      return mData.get(position);
 }

 @Override
 public long getItemId(int position) {
      return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent)
 {
      ViewHolder holder;
      String item = (String)this.getItem(position);

      if (convertView == null)
      {         
           holder = new ViewHolder();

           convertView = mInflater.inflate(R.layout.main, parent, false);
           holder.text = (TextView)convertView.findViewById(R.id.text);
           convertView.setTag(holder);
      } else {
           holder = (ViewHolder)convertView.getTag();
      }
      TextView tvText = holder.text;
      tvText.setText(item);
 }

 static class ViewHolder {
      TextView text;
 }

Lo que sucede es que el texto "no encontrado elementos" se muestra bien, cuando la matriz de cadenas "elementos" no tiene datos. Hay un proceso en el método PopulateItem () que llenará la matriz con datos, y si hay datos, el texto "No se encontró" que se encuentren en cada fila de la lista, "debajo" de los datos. Por lo tanto, el texto vacío básicamente está siendo superpuesto por los datos.

¿Fue útil?

Solución

No estoy seguro de si hizo algún tipo de errores en su pregunta para su código. Parece que elimina partes de su código antes de publicarlo aquí.

getView () está destinado a elaborar una vista para una fila en particular En su lista de listview. Supongo que realmente infló su main.xml, que es su relativeLayayout que contiene ListView, EmptyView y otro TextView.

Si su View de ListView solo está desaprobando las cadenas, simplemente instancie un TextView y devuélvelo en GetView

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  String item = (String)this.getItem(position);

  if (convertView == null)
  {         
       convertView = new TextView(context);
  } 
  convertView.setText(item);
  return convertView
}

Pase en el contexto a través del constructor de su adaptador personalizado

Editar: Mostrar múltiples vistas de text en una sola fila

Si voy a ser estricto al respecto, el problema no está en la línea convertView = minflater.inflate (). El error está en el archivo inflado. Por lo general, es más fácil inflar otro archivo XML si tiene una vista más compleja para cada fila en su View de ListView. El error anterior es de alguna manera una inflación aparentemente recursiva de Main.xml

Para manejar múltiples textview, haz sth así:

Cree otro archivo XML para representar cada fila en su lista de listview, list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  .....
 >
  <TextView android:id="@+id/list_text_1"
    ....
  />

  <TextView android:id="@+id/list_text_2"
    ....
  />

  <TextView android:id="@+id/list_text_3"
    ....
  />
 </LinearLayout>

En su implementación de getView en su adaptador,

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  String item = (String)this.getItem(position);

  if (convertView == null)
  {         
     convertView = mInflater.inflate(R.layout.list_item.xml, parent, false);
     //link list_text_1, list_text_2, list_text_3 as you need to the individual   
     // textviews
  } 
  else {
    // TODO linking up the textviews when convertView is not null
  }
  return convertView
}

Este es probablemente un buen momento para traer el patrón Viewholder teniendo en cuenta que necesita inflar un archivo XML. Página 19/19 del archivo PDF vinculado en este responder Da una buena explicación sobre el patrón Viewholder.

Por último, lea más ejemplos de ListView y observe cuándo usan el inflater en GetView y qué en realidad se inflan.

Otros consejos

Debido a que su vista de texto con ID "vacía" aún es visible, establezca la visibilidad de esa vista como invisible inicialmente y si la lista está vacía, solo hágalo visible,
Mire el parámetro Android: visibilidad = "invisible".
y en el código si la lista está vacía YourTextView.SetVisibility (Ver.Visibile)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top