Вопрос

Я вытаскиваю волосы, пытаясь понять это. Из всех учебных пособий, которые я читал, то, как у меня есть эта установка. У меня есть список, которая использует пользовательский адаптер для отображения некоторых данных. Я хотел бы отобразить сообщение «Нет элементов», если адаптер пуст.

Это моя макет:

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

Это мой код:

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

То, что происходит, - это текст «Нет элементов», пока отображается нормально, когда строковый массив «элементы» не имеет данных. В методе PopulateItem () есть процесс, который будет заполнять массив данными, и если есть данные, текст «нет элементов», текст все еще можно увидеть в каждой строке листинга »внизу» данных. Таким образом, пустой текст в основном накладывается на данные.

Это было полезно?

Решение

Я не уверен, что вы сделали какие -либо опечатки в своем вопросе для вашего кода. Похоже, вы разбираете части своего кода, прежде чем публиковать его здесь.

getView () предназначен для вас, чтобы создать вид на конкретный ряд в вашем списке. Я предполагаю, что вы на самом деле раздували свой main.xml, который является вашим RELATIVELAYOUT, содержащим LISTVIEW, EMPECTVIEW и еще один TextView.

Если ваш ListView - это только Dislay Strings, просто создайте экземпляр TextView и верните его в 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
}

Пропустите контекст через конструктор вашего пользовательского адаптера

РЕДАКТИРОВАТЬ: Показание нескольких TextViews в одной строке

Если я собираюсь быть строгим об этом, проблема не в линии ConvertView = minflater.inflate (). Ошибка в файле надуваемой. Обычно легче надувать другой XML -файл, если у вас есть более сложное представление для каждой строки в вашем списке. Более ранняя ошибка - что -то, казалось бы, рекурсивное надувание Main.xml

Чтобы обрабатывать несколько TextView, сделайте STH, как это:

Создайте еще один XML -файл, чтобы представить каждую строку в вашем списке, 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>

В вашей реализации GetView в вашем адаптере,

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

Вероятно, это хорошее время, чтобы привлечь шаблон владельца просмотра, учитывая, что вам нужно надуть файл XML. Страница 11/19 файла PDF, связанного в этом отвечать дает довольно хорошее объяснение о моделях Viewholder.

Наконец, прочитайте больше примеров ListView и соблюдайте, когда они используют Inflater в GetView и какие Они на самом деле раздувают.

Другие советы

Поскольку ваш текстовый вид с идентификатором «пустой» все еще видна, установите видимость этого представления как невидимое изначально, и если список пуст, только сделайте его видимым,
Посмотрите на Android: видимость = "невидимый" параметр.
и в коде, если список пуст yourtextview.setvisibility (view.visibile)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top