Question

Je tire mes cheveux à essayer de comprendre. De tous les tutoriels que j'ai lu, la façon dont j'ai cette configuration devrait fonctionner. J'ai un ListActivity qui utilise un adaptateur personnalisé pour afficher des données. Je voudrais afficher un message « aucun élément trouvé » si l'adaptateur est vide.

Ceci est ma mise en page:

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

Ceci est mon 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;
 }

Qu'est-ce qui se passe est le « Aucun article trouvé » texte affiche bien, lorsque le tableau de chaînes « articles » n'a pas de données. Il y a un processus dans la méthode PopulateItem () qui remplir le tableau avec les données, et s'il y a des données, les « Pas d'éléments trouvés » texte peut encore être vu sur chaque ligne de la liste, « sous » les données. Ainsi, le texte vide est essentiellement se superposant par les données.

Était-ce utile?

La solution

Je ne sais pas si vous avez fait des fautes de frappe dans votre question pour votre code. Il semble que vous dépouillez des parties de votre code avant de poster ici.

getView () est destiné à vous fabriquiez une vue pour une ligne particulière dans votre ListView. Je devine que vous réellement gonflé votre main.xml, qui est votre RelativeLayout contenant le ListView, EmptyView et un autre TextView.

Si votre ListView est uniquement les chaînes dislaying, juste instancier un TextView et le retourner dans 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
}

passe dans le contexte par le constructeur de votre adaptateur personnalisé

Modifier: Afficher plusieurs textviews en une seule rangée

Si je vais être stricte à ce sujet, le problème est pas dans la ligne convertView = mInflater.inflate (). L'erreur est dans le fichier gonflé. Il est généralement plus facile de gonfler un autre fichier xml si vous avez une vue plus complexe pour chaque ligne de votre listview. L'erreur antérieure est somehwhat apparemment récursive de gonflement main.xml

Pour gérer plusieurs textview, faire qqch comme ceci:

Créez un autre fichier XML pour représenter chaque ligne de votre 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>

Dans votre implémentation getView dans votre adaptateur,

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

Ceci est probablement un bon moment pour apporter le modèle de viewholder vous devez considérer pour gonfler un fichier xml. Page 11/19 du fichier pdf lié dans cette réponse donne une assez bonne explication sur le motif ViewHolder.

Enfin, lisez-travers d'autres exemples de ListView, et observer quand ils utilisent le gonfleur dans getView et ce ils fait gonfler.

Autres conseils

Parce que votre mode texte avec id « vide » est encore visible, définir la visibilité de ce point de vue comme invisible au départ et si la liste est vide, faire seulement visible,
regard sur android. visibilité = paramètre « invisible »
et dans le code si la liste est vide yourtextview.setVisibility (View.VISIBILE)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top