Customizar ListView setEmptyView

Bom Dia,

Existe alguma forma de customizar uma listView além do textView padrão? A tela fica vazia obviamente, mas gostaria de alterar a cor do background

 mEstadoVazioTextView = (TextView) findViewById(R.id.visualizacaoVazia);
        listview.setEmptyView(mEstadoVazioTextView);

 mEstadoVazioTextView.setText("Nenhum livro encontrado!\n\nFavor verificar ortografia ou" +
                    " informar algum dado sobre o livro novamente.");

http://stackoverflow.com/questions/7789875/how-to-set-background-for-textview-in-code

TextView

API JAVA
txt.setBackgroundColor(Color.parseColor("#BABABA"));

ou

txt.setBackgroundColor(Color.RED);

ListView

http://stackoverflow.com/questions/11553156/setting-the-background-color-of-a-listview-through-xml

API JAVA

ListView mainListView;  
mainListView = (ListView) findViewById( R.id.listView1 );
mainListView.setBackgroundColor(Color.BLACK);

XML
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:layout_centerHorizontal="true"
android:layout_centerVertical=“true” >

Boas praticas

<?xml version="1.0" encoding="utf-8"?>
<resources>
      <color name="orange">#ff5500</color>
</resources>

Preciso da alteração da cor de background apenas se a busca voltar vazia, alterando a cor do android:background="#FFFFFF", não alteraria toda minha lista qndo a resposta apresentar itens?

Preciso da alteração da cor de background apenas se a busca voltar vazia, alterando a cor do android:background="#FFFFFF", não alteraria toda minha lista qndo a resposta apresentar itens?

Quando a listView estiver vazia ele ira trocar o fundo pela view que quiser. teve um comentário falando sobre stub, achei interessante, só não sei se ainda é aplicado em versões novas.

listView.setEmptyView(findViewById(R.id.emptyElement));

http://stackoverflow.com/questions/3771568/showing-empty-view-when-listview-is-empty

Pode parecer gambiarra, mas…

Eu deixo um TextView invisível no layout da forma que eu quero, quando eu faço o request e o resultado vier vazio eu tiro a invisibilidade desse TextView.

Se vier ao menos um resultado eu volto a tornar esse TextView invisível e apareço com a lista

1 curtida

Olha, eu deixo um TextView dentro do layout do ListView, existe um método setEmptyView() que retorna esse textView da lista quando o resultado for vazio, dá uma olhada, mais fácil e menos gambi haha

O que eu preciso na verdade, é trocar a cor da tela qndo o resultado for vazio, pois meu adapter está carregado em um Loader fora do onCreate e não consigo referenciar a listView

package com.example.android.listadelivros;

import android.app.LoaderManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

public class ExibirListaLivros extends AppCompatActivity
        implements LoaderManager.LoaderCallbacks<List<DadosLivro>> {

    private TextView mEstadoVazioTextView;

    public static String consultaDadoInformado = null;
    private static final int DADOSLIVROS_ID_LOADER = 1;
    private DadosLivrosAdapter mAdapter;

    public static String removeAcento(String str) {
        str = java.text.Normalizer.normalize(str, java.text.Normalizer.Form.NFD);
        str = str.replaceAll("[^\\p{ASCII}]", "");
        return str;
    }

    public static String encode(String valorDigitado) {
        try {
            return consultaDadoInformado = URLEncoder.encode(valorDigitado, "utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    private String googleLivroURL = "https://www.googleapis.com/books/v1/volumes?q="
            + consultaDadoInformado;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        ListView listview = (ListView) findViewById(R.id.lista);
        mAdapter = new DadosLivrosAdapter(this, new ArrayList<DadosLivro>());
        listview.setAdapter(mAdapter);

        mEstadoVazioTextView = (TextView) findViewById(R.id.visualizacaoVazia);
        listview.setEmptyView(mEstadoVazioTextView);

        ConnectivityManager verificarConexaoInternet = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo informacaoRede = verificarConexaoInternet.getActiveNetworkInfo();

        if (informacaoRede != null && informacaoRede.isConnected()) {

            final LoaderManager loaderManager = getLoaderManager();
            loaderManager.initLoader(DADOSLIVROS_ID_LOADER, null, this);
        } else {
            View indicadorProcessamento = findViewById(R.id.indicadorProcessamento);
            indicadorProcessamento.setVisibility(View.GONE);
            mEstadoVazioTextView.setText("Nenhuma rede disponível!\n\nVerifique a " +
                    "conexão e tente novamente");
        }

        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View visualizacao,
                                    int posicao, long l) {

                DadosLivro livroClicado = mAdapter.getItem(posicao);

                Uri informacoesLivroUri = Uri.parse(livroClicado.getComprarLivro().trim());
                Intent siteGoogleLivros = new Intent(Intent.ACTION_VIEW, informacoesLivroUri);
                if (siteGoogleLivros.resolveActivity(getPackageManager()) != null) {
                    startActivity(siteGoogleLivros);
                }

            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                startActivity(new Intent(this, MainActivity.class));
                finishAffinity();
                break;
            default:break;
        }
        return true;
    }

    @Override

    public android.content.Loader<List<DadosLivro>> onCreateLoader(int i, Bundle bundle) {

        return new DadosLivrosLoader(this, googleLivroURL);
    }

    @Override
    public void onLoadFinished(android.content.Loader<List<DadosLivro>> loader, List<DadosLivro>
            informacoesLivros) {

        View indicadorProcessamento = findViewById(R.id.indicadorProcessamento);
        indicadorProcessamento.setVisibility(View.GONE);

        mEstadoVazioTextView.setBackgroundColor(Color.parseColor("#EEEEEE"));
        mEstadoVazioTextView.setText("Nenhum livro encontrado!\n\nFavor verificar ortografia ou" +
                " informar algum dado sobre o livro novamente.");

        mAdapter.clear();

        if (informacoesLivros != null && !informacoesLivros.isEmpty()) {
            mAdapter.addAll(informacoesLivros);
        }
    }

    @Override
    public void onLoaderReset(android.content.Loader<List<DadosLivro>> loader) {
        mAdapter.clear();
    }

}

o problema é que minha lista é carregada fora do onCreate, assim não consigo referenciar o background dela, a variavel listView fica sem existir por estar fora do escopo :confused: Postei o código mais abaixo, dá uma olhada, obrigada :slight_smile:

Não havia pensado nisso, era uma coisa idiota, deixei a variável global e tudo certo, burrice rs Obrigada pela ajuda rs