Frage

Ich ziehe mir die Haare heraus und versuche das herauszufinden. Aus all den Tutorials, die ich gelesen habe, sollte die Art und Weise, wie ich dieses Setup habe, funktionieren. Ich habe eine Listenaktivität, die einen benutzerdefinierten Adapter verwendet, um einige Daten anzuzeigen. Ich möchte eine Nachricht "Keine Elemente gefunden" anzeigen, wenn der Adapter leer ist.

Das ist mein 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>

Dies ist mein Code:

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

Was passiert, ist der Text "No -Elements Found" wird fein angezeigt, wenn das String -Array "Elemente" keine Daten enthält. Es gibt einen Prozess in der Methode PopulateItem (), die das Array mit Daten füllt, und wenn Daten vorhanden sind, können in jeder Zeile der Auflistung noch der Text "No -Elemente gefunden" angezeigt werden, unter den Daten. Der leere Text wird also im Grunde genommen von den Daten überlagert.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob Sie in Ihrer Frage nach Ihrem Code Tippfehler gemacht haben. Es sieht so aus, als würden Sie Teile Ihres Codes ausziehen, bevor Sie ihn hier veröffentlichen.

GetView () ist für Sie gedacht, für die Sie eine Aussicht aufnehmen können eine bestimmte Reihe in Ihrer Liste. Ich vermute, Sie haben Ihre main.xml tatsächlich aufgeblasen, was Ihr RelATivalout mit ListView, LeereView und einem anderen Textansicht enthält.

Wenn Ihr Listansicht nur absagt, instanziieren Sie einfach eine Textansicht und geben

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

Geben Sie den Kontext über den Konstruktor Ihres benutzerdefinierten Adapters ein

Bearbeiten: Anzeigen mehrerer Textansichten in einer einzelnen Zeile

Wenn ich streng darauf bin, liegt das Problem nicht in der Linie convertView = minflater.inflate (). Der Fehler befindet sich in der aufgeblasenen Datei. In der Regel ist es einfacher, eine andere XML -Datei aufzublasen, wenn Sie für jede Zeile in Ihrer Listansicht eine komplexere Ansicht haben. Der frühere Fehler ist irgendwie anscheinend rekursiv aufgeblasen.xml

Um mehrere Textansichten zu verarbeiten, so wie folgt:

Erstellen Sie eine andere XML -Datei, um jede Zeile in Ihrer ListView list_item.xml darzustellen

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

In Ihrer GetView -Implementierung in Ihrem Adapter,

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

Dies ist wahrscheinlich ein guter Zeitpunkt, um das Vieweholder -Muster einzubringen, wenn man bedenkt, dass Sie eine XML -Datei aufblasen müssen. Seite 11/19 der in dieser verknüpften PDF -Datei Antworten gibt eine ziemlich gute Erklärung über das Sehhalter -Muster.

Zuletzt lesen Sie weitere Beispiele für ListView und beobachten Sie, wann sie den Inflater in GetView und verwenden was Sie blasen tatsächlich auf.

Andere Tipps

Da Ihre Textansicht mit der ID "leer" immer noch sichtbar ist, setzen Sie die Sichtbarkeit dieser Ansicht zunächst als unsichtbar und wenn die Liste leer ist, machen Sie sie nur sichtbar.
Schauen Sie sich Android an: Sichtbarkeit = "Invisible" Parameter.
und im Code, wenn die Liste leer ist, ist yourTextView.setvisibility (View.visBile)

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