пустое представление на ListActivity не работает - PullRequest
0 голосов
/ 06 сентября 2011

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

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

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

Что происходит, текст «No Items Found» отображается нормально, когда в строковом массиве «items» нет данных.В методе PopulateItem () есть процесс, который заполняет массив данными, и, если они есть, текст «No Items Found» все еще можно увидеть в каждой строке списка, «под» данными.Таким образом, пустой текст в основном перекрывается данными.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Поскольку ваше текстовое представление с идентификатором «пусто» по-прежнему отображается, установите видимость этого представления изначально невидимым, а если список пуст, то только сделайте его видимым,
посмотрите на параметр android: visibility = "invisible".
и в коде, если список пуст, yourtextview.setVisibility (View.VISIBILE)

0 голосов
/ 06 сентября 2011

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

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

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

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

Редактировать: Отображение нескольких текстовых представлений в одной строке

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

. Для обработки нескольких текстовых представлений выполните следующее:

Создайте еще один 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 и посмотрите, когда они используютинфлятор в getView и что они фактически раздувают.

...