Mostrando exibição vazia quando o ListView estiver vazio

135

Por algum motivo, a exibição vazia, um TextView , nesse caso, sempre aparece mesmo quando o ListView não está vazio. Eu pensei que o ListView detectaria automaticamente quando mostrar a exibição vazia.

<RelativeLayout android:id="@+id/LinearLayoutAR"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">
    <ListView android:id="@+id/ARListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"></ListView>
    <ProgressBar android:id="@+id/arProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"></ProgressBar>
    <!-- Here is the view to show if the list is emtpy -->
    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="No Results" />
</RelativeLayout>

Como conectar a visualização vazia corretamente?

Sheehan Alam
fonte

Respostas:

135

Deve ser assim:

<TextView android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="No Results" />

Observe o atributo id .

Nathan Schwermann
fonte
75
você precisa usar um ListViewActivity para que ele funcione dessa maneira.
Nathan Schwermann
2
oh, eu vejo, meu ListView é realmente dentro de um ViewFlipper. Existe outra maneira de apresentar a exibição quando a lista estiver vazia?
Sheehan Alam
11
você mesmo implementou a lógica, dê uma olhada no código-fonte para ListViewActivity para ver como eles o fazem ou quando você faz sua consulta para verificar se está vazia, se você definir sua exibição de texto como VISÍVEL, caso contrário, defina-a como GONE
Nathan Schwermann
4
o uso da visualização de texto quando você estiver usando um adaptador personalizado não está funcionando.
user590849
3
@schwiz false! você não precisa de um ListViewActivity para usar a funcionalidade vazia.
Buffalo
187

Quando você estende FragmentActivityou Activitye não ListActivity , você vai querer dar uma olhada:

ListView.setEmptyView ()

appsthatmatter
fonte
alguma idéia de como fazer isso no inventor de aplicativos?
21715 JinSnow
118

Como diz appsthatmatter, no layout, algo como:

<ListView android:id="@+id/listView" ... />
<TextView android:id="@+id/emptyElement" ... />

e na atividade vinculada:

this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.emptyElement));

Também funciona com um GridView ...

Eddy
fonte
4
Depois de pelo menos uma hora tentando várias coisas e não tendo nada funcionando (mostrando o texto "vazio", além dos dados na exibição de lista), isso funcionou para mim ao usar um ListView em uma atividade em vez de estender o ListActivity. Obrigado Eddy!
Evan R.
Devo deixar o TextView oculto ou algo assim?
perfil completo de Harsha MV
11
@Harsha android: visible = "gone"
scragar 26/06
42

Se você está procurando por uma solução completa para o seu problema, entre em contato conosco.

O arquivo xml :

<RelativeLayout
    android:id="@+id/header_main_page_clist1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    android:paddingBottom="10dp"
    android:background="#ffffff" >

    <ListView
        android:id="@+id/lv_msglist"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/divider_color"
        android:dividerHeight="1dp" />

    <TextView
        android:id="@+id/emptyElement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="NO MESSAGES AVAILABLE!"
        android:textColor="#525252"
        android:textSize="19.0sp"
        android:visibility="gone" />
</RelativeLayout>

O textView ( "@ + id / emptyElement" ) é o espaço reservado para a lista vazia.

Aqui está o código para a página java:

lvmessage=(ListView)findViewById(R.id.lv_msglist);
lvmessage.setAdapter(adapter);
lvmessage.setEmptyView(findViewById(R.id.emptyElement));

Lembre-se de colocar o emptyView depois de vincular o adaptador ao listview.Mine não estava funcionando pela primeira vez e depois que mudei o setEmptyView após o setAdapter que está funcionando agora.

Resultado:

insira a descrição da imagem aqui

kgandroid
fonte
1
Isso funcionou para mim depois de adicionar android:layout_below="@+id/lv_msglist"para emptyElement
Behnam Heydari
16

Eu recomendo que você use ViewStubs como este

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1" >

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

    <ViewStub
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout="@layout/empty" />
</FrameLayout>

Veja o exemplo completo de Cyril Mottier

LOG_TAG
fonte
8
<ListView android:id="@+id/listView" ... />
<TextView android:id="@+id/empty" ... />
and in the linked Activity:

this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.empty));

Isso funciona claramente com FragmentActivity se você estiver usando a biblioteca de suporte. Testei isso construindo para a API 17, isto é, imagem 4.2.2.

Yaojin
fonte
7

Código de atividade, é importante estender ListActivity.

package com.example.mylistactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import com.example.mylistactivity.R;

// It's important to extend ListActivity rather than Activity
public class MyListActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylist);

        // shows list view
        String[] values = new String[] { "foo", "bar" };

        // shows empty view
        values = new String[] { };

        setListAdapter(new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_1,
                android.R.id.text1,
                values));
    }
}

Layout XML, o ID nas duas visualizações é importante.

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

    <!-- the android:id is important -->
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

    <!-- the android:id is important -->
    <TextView
        android:id="@android:id/empty"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="i am empty"/>
</LinearLayout>
Mizipzor
fonte
7

Apenas para adicionar que você realmente não precisa criar novos IDs, algo como o seguinte funcionará.

No layout:

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

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@android:id/empty"
    android:text="Empty"/>

Então na atividade:

    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setEmptyView(findViewById(android.R.id.empty));
Luís Ramalho
fonte
4

Eu tive esse problema. Eu tive que fazer minha classe estender ListActivity em vez de Activity e renomear minha lista no XML paraandroid:id="@android:id/list"

Matt
fonte
2

Uma solução programaticamente será:

TextView textView = new TextView(context);
textView.setId(android.R.id.empty);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setText("No result found");
listView.setEmptyView(textView);
Mika
fonte
-3

Primeiro verifique se a lista contém alguns valores:

if (list.isEmpty()) {
    listview.setVisibility(View.GONE);
}

Se estiver tudo bem, use:

else {
     listview.setVisibility(View.VISIBLE);
}
Avnish Kumar
fonte
você gostaria de elaborar mais o que é um list?
Roy Lee
É um ArrayList <xyz>
Avnish Kumar,
Objeto [] resposta = Utility.parseStationresponce (object); int statusCode = (Inteiro) resposta [0]; @SuppressWarnings ("desmarcado") ArrayList <Stations> list = (ArrayList <Stations>) resposta [2];
Avnish Kumar
Bem, sugiro que você coloque isso como parte de sua resposta do que comentários. Isso é importante para que outras pessoas compreendam o contexto específico do que você está escrevendo. Além disso, também é melhor se você puder relacionar sua resposta à pergunta do OP. Finalmente, bem-vindo ao SO.
Roy Lee