Подтвердить что ты не робот

Android отображает текст, когда ListView пуст

Я устанавливаю TextView с идентификатором @android:id/empty для отображения сообщения, если в ListView нет элементов. Тем не менее, этот TextView отображается, даже если в ListView есть элементы, прямо перед тем, как появятся элементы.

Как я могу сделать так, чтобы он отображался только тогда, когда в ListView нет элементов?

<?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="@android:id/list"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:dividerHeight="1dp" >
</ListView>

<TextView 
    android:id="@android:id/empty"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/empty_list" />

</LinearLayout>

PS: Я использую Loader и SimpleCursorAdapter с ListFragment.

4b9b3361

Ответ 1

Я предполагаю, что вы используете обычный Fragment или Activity с ListView внутри него. Если это так, вы должны добавить пустой макет в ListView вручную.

например.

ListView lv = (ListView)findViewById(android.R.id.list);
TextView emptyText = (TextView)findViewById(android.R.id.empty);
lv.setEmptyView(emptyText);

Затем ваш ListView будет автоматически использовать это представление, когда его адаптер пуст.

Если вы используете ListActivity, вам не нужно вызывать setEmptyView() в ListView, так как ListActivity автоматически управляет этим для вас.

Ответ 2

Установите TextView и назначьте ему все, что вы хотите отобразить, когда ListView пуст:

ProjectListAdapter projectListAdapter = new ProjectListAdapter();
TextView empty=(TextView)findViewById(R.id.empty);
projectsListView.setEmptyView(empty);

И в моем XML файле мы пишем ниже код

<TextView
      android:id="@+id/empty"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:gravity="center"
      android:text="Your text here"
      android:textColor="#FFFFFF" />

Ответ 3

У меня была эта проблема. Вы должны явно указать пустое окно в своем коде.

Измените свой TextView:

<TextView 
    android:id="@android:id/emptyResults"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/empty_list" />

Затем в onCreate():

listViewResults = (ListView) findViewById(R.id.list);
listViewResults.setEmptyView((LinearLayout) findViewById(R.id.emptyResults)); 

В приведенном выше коде предполагается, что ваш ListView находится в LinearLayout.

Ответ 4

Я использовал ListFragment и имел ту же проблему. Я испробовал все варианты из этих ответов, но проблема не была решена.

Итак, я нашел свой вариант, чтобы переопределить setEmptyText():

public class NewsFragment extends ListFragment{
    private TextView emptyText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        //...

        emptyText = (TextView)view.findViewById(android.R.id.empty);

        //...
    }

    @Override
    public void setEmptyText(CharSequence text) {
        emptyText.setText(text);
    }
}

Надеюсь, что это будет полезно для кого-то.

Ответ 5

Я знаю, что это довольно поздно, но для работы с XML вам нужно наложить вес на ListView и иметь TextView match_parent

<?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="@android:id/list"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:dividerHeight="1dp" >
</ListView>

<TextView 
    android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/empty_list" />

</LinearLayout>