Domanda

sto tirando fuori i miei capelli cercando di capire questo fuori. Da tutti i tutorial che ho letto, il modo in cui ho questa impostazione dovrebbe funzionare. Ho un ListActivity che utilizza un adattatore personalizzato per visualizzare alcuni dati. Mi piacerebbe mostrare un "Nessun modello trovato" messaggio se la scheda è vuota.

Questo è il mio layout:

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

Questo è il mio codice:

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

Quello che succede è il "Nessun modello trovato" testo viene visualizzato bene, quando il "voci" matrice di stringhe non ha dati. C'è un processo nel metodo PopulateItem () che compilare la matrice con i dati, e se ci sono dati, il "Nessun modello trovato" testo può ancora essere visto su ogni riga della messa in vendita, "sotto" i dati. Così il testo vuoto è fondamentalmente essendo sovrapposto dai dati.

È stato utile?

Soluzione

Non sono sicuro se sono state apportate eventuali errori di battitura nella tua domanda per il codice. Sembra che si striscia fuori parti del codice prima di pubblicare qui.

GetView () è pensato per voi per realizzare una View per una particolare riga nel vostro ListView. Sto indovinando che in realtà gonfiato la vostra main.xml, che è il vostro RelativeLayout che contiene il controllo ListView, EmptyView e un altro TextView.

Se il vostro ListView è dislaying solo stringhe, solo un'istanza di un TextView e restituirlo in 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
}

Passo nel contesto attraverso il costruttore della scheda personalizzata

Modifica: Questa è la più textviews in una singola riga

Se ho intenzione di essere rigorosi su di esso, il problema non è nella linea convertView = mInflater.inflate (). L'errore è nel file gonfiato. Di solito è più facile da gonfiare un altro file XML se si dispone di una visione più complessa per ogni riga nel vostro ListView. L'errore precedente è somehwhat gonfiaggio apparentemente ricorsiva di main.xml

Per gestire TextView multipla, fare sth in questo modo:

Creare un altro file XML per rappresentare ogni riga nel vostro 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>

Nell'implementazione GetView l'adattatore,

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

Questo è probabilmente un buon momento per portare nel modello viewholder considerando è necessario per gonfiare un file xml. Pagina 11/19 del file pdf collegato in questo risposta dà una buona spiegazione abbastanza circa il modello ViewHolder.

Infine, leggo attraverso altri esempi di ListView, e osservare quando si usano il gonfiatore in GetView e quanto in realtà gonfio.

Altri suggerimenti

A causa la visualizzazione di testo con id "vuoto" è ancora visibile, impostare la visibilità di questa tesi, come invisibile inizialmente e se la lista è vuota poi fare solo visibile,
un'occhiata a Android:. visibilità = parametro "invisibile"
e nel codice, se lista è yourtextview.setVisibility vuota (View.VISIBILE)

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