2010-11-03 2 views
31

У меня есть ListView, который может содержать 0 пользовательских элементов внутри (например, «Мои загрузки»).Android ListView: текст по умолчанию, когда нет товаров

Есть ли хоть какой-нибудь текст по умолчанию «Пока еще нет загрузок»?

Спасибо!

EDIT: вот мое решение,

TextView emptyView = new TextView(getApplicationContext()); 
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
emptyView.setTextColor(R.color.black); 
emptyView.setText(R.string.no_purchased_item); 
emptyView.setTextSize(20); 
emptyView.setVisibility(View.GONE); 
emptyView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); 

((ViewGroup)getListView().getParent()).addView(emptyView); 
getListView().setEmptyView(emptyView); 

alt text

+0

Почему свойство View.GONE установка? – medonja

+1

@medonja, потому что метод setEmptyView (emptyView) не работает должным образом, если вы сначала не добавляете пустой вид в иерархию представлений, но при этом пустое изображение всегда будет видимым. Таким образом, вы должны сделать это GONE, и это хорошо работает, так как функция setEmptyView() просто изменяет видимость emptyView в соответствии с пустым состоянием списка. – tomalf2

ответ

36
public void setEmptyView (View emptyView) 

Since: API Level 1 
Sets the view to show if the adapter is empty 

Призвал экземпляра ListView.

E.g. mListView.setEmptyView (someView);

Вы можете построить вид на лету или надуть один из xml.

1

Существует еще один подход. У BaseAdapter есть метод isEnabled(). Вам необходимо создать собственный адаптер, который будет возвращать для определенных элементов isEnabled (int position) как false. В этом случае эти элементы будут недоступны. Его легко модифицировать так, чтобы при пустом списке просто добавьте один отключенный элемент.

Но наверняка описанным выше способом Алекс Орлов лучше

16

Если я неправильно понял ваш вопрос, вы можете просто указать любой вид элемента с идентификатором «@android: идентификатор/пустой» в макете, и это будет автоматически позаботиться о вас. Например:

<ListView android:id="@android:id/list" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:visibility="visible"/> 

<LinearLayout android:id="@android:id/empty" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:gravity="center"> 

    <TextView android:text="@string/no_messages" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     style="@style/textBoldLight"> 
    </TextView> 

</LinearLayout> 
+0

Я не думал о том, чтобы дать идентификатор пустой линейной компоновке, чтобы центр «никаких элементов не нашел», хорошее мышление. –

+6

Это будет работать только для 'ListActivity'. Вам нужно будет использовать подход Алекса для других классов 'Activity'. –

0

Если вы используете Activity вместо ListActivity и хотите, чтобы установить серьезность пустой до центра (как по горизонтали, так и по вертикали), вы должны использовать их:

В макете:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

    <ListView 
     android:id="@+id/contacts" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <LinearLayout 
     android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/no_contacts_add_one"> 
     </TextView> 

    </LinearLayout> 


</LinearLayout> 

В вашей деятельности:

ListView contacts = (ListView) view.findViewById(R.id.contacts); 
contacts.setEmptyView(view.findViewById(android.R.id.empty)); 
Смежные вопросы