Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

ListView com fundo e texto branco no aparelho

Boa noite, estou seguindo os exemplos pelo emulador e tudo roda bem, mas quando rodei pelo aparelho físico, a cor de fundo e dos itens no ListView são brancos. As funcionalidades estão sendo executadas igual como ocorre no emulador, mas as cores não. No emulador a ListView tem a cor dos itens preto, e o fundo branco, no celular estão da mesma cor.

Como faz para resolver?

6 respostas

Oi Gilmar, tudo bem ?

Cara fala uma coisa pra mim, no seu celular, qual é a versão do android que você tem usado ?

E mostra para gente qual é o código que está fazendo para exibir as cores por gentileza.

Abraços

A versão do Android no meu aparelho é 6.0.1, e o código é igual ao demonstrado nos exemplos, no emulador Nexus S, o ListView roda igual ao demonstrado no curso, mas no meu aparelho, fica tudo branco, o fundo e o item.

Oi Gilmar,

Posta o código para eu saber qual é o problema, mas acredito que seja o método que está usando, pode estar obsoleto, a diferença é que quando algum método está obsoleto no Android nas próximas versões do SO eles retiram o método justamente para desencorajar os desenvolvedores a utiliza-lo.

Confirma para mim que está dessa forma :

if(posicao % 2 == 0 ) {
    view.setBackgroundColor(activity.getResources(). getColor(R.color.linha_par, activity.getTheme()));
} else {
    view.setBackgroundColor(activity.getResources().getColor(R.color.linha_impar, activity.getTheme()));
}

Boa noite, segue o código abaixo, relacionado ao listiview

manifesto.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gilmar.agenda">
    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity">

        </activity>
    </application>

</manifest>

styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

activity_lista_aluno.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_lista_alunos"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

    <Button
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:id="@+id/listaAlunos_novoAluno"
        android:text="+"
        android:textColor="#ffffff"
        android:textSize="40sp"
        android:elevation="6dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="16dp"
        android:layout_marginRight="16dp"
        android:stateListAnimator="@null"
        android:background="@drawable/fundo"/>

</RelativeLayout>

Classe ListaAluno

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

        //Classe para tratar as referencias do xml e da classe
        parseViewAluno = new ParseViewAluno(this);
        listaAluno = parseViewAluno.getLista();

        //Listener da listView Alunos
        listaAluno.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> list, View item, int position, long id) {

                //Envia os dados do aluno, pego no item da list view e envia para o formulario usando a intent
                aluno = (Aluno) listaAluno.getItemAtPosition(position);
                Intent vaiParaFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                vaiParaFormulario.putExtra("Aluno", aluno);
                startActivity(vaiParaFormulario);
            }
        });


        //Botão adicionar novo aluno
        Button novoAluno = (Button) findViewById(R.id.listaAlunos_novoAluno);
        novoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent vaiParaFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                startActivity(vaiParaFormulario);
            }
        });

        //Autoriza os itens da list view que permitam o uso de menu de contexto
        registerForContextMenu(listaAluno);
    }

Classe Auxiliar ParseView

//classe auxiliar para tratar as referencias do xml e das classes
public class ParseViewAluno {

    private ControlaAlunoDB alunoDB;
    private Aluno aluno;
    private EditText cNome;
    private EditText cEndereco;
    private EditText cTelefone;
    private EditText cSite;
    private RatingBar cNota;

    private ListView lista;
    private ListAdapter adapter;
    private Context context;
    private Activity activity;

    //Construtor que recebe uma instacia de FormularioActivity e aluno
    public ParseViewAluno(FormularioActivity activity, Aluno aluno){
        getViewAluno(activity);
        this.aluno = aluno;
    }

    //Construtor que recebe uma instacia de FormularioActivity e dados do aluno
    public ParseViewAluno(FormularioActivity activity, boolean isId, Long id) {

     getViewAluno(activity);
     //Se isId for igual a true, uma nova instancia de aluno com uma id já existente é criada
     if(isId){
     aluno  = new Aluno(id, cNome.getText().toString(), cEndereco.getText().toString(),
              cTelefone.getText().toString(), cSite.getText().toString(),
              Double.valueOf(cNota.getProgress()));
    }
    //Se isId for igual a false, uma nova instancia de aluno sem id é criada
    else{
         aluno  = new Aluno(cNome.getText().toString(), cEndereco.getText().toString(),
                 cTelefone.getText().toString(), cSite.getText().toString(),
                 Double.valueOf(cNota.getProgress()));
     }
    }

    //Construtor que recebe uma instacia de ListaActivity
    public ParseViewAluno(ListaAlunosActivity activity) {
        context = activity.getApplicationContext();
        lista = (ListView) activity.findViewById(R.id.listaAlunos_lista);
    }

    //Faz uma parse das view no xml para os atributos da classe que fazem referencia
    public void getViewAluno(Activity activity){

        cNome = (EditText) activity.findViewById(R.id.formulario_nome);
        cEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        cTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        cSite = (EditText) activity.findViewById(R.id.formulario_site);
        cNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
    }

    //Faz uma parse dos atributos da classe para as view no xml que fazem referencia
    public void setViewAluno(){

        cNome.setText(aluno.getNome());
        cEndereco.setText(aluno.getEndereco());
        cTelefone.setText(aluno.getTelefone());
        cSite.setText(aluno.getSite());
        cNota.setProgress(aluno.getNota().intValue());
    }

    //retorna uma istancia de aluno
    public Aluno getAluno(){
        return aluno;
    }

    //retorna uma lista de alunos buscada no db
    public List<Aluno> getAlunos(){
        alunoDB = new ControlaAlunoDB(context);
        List<Aluno> alunos = alunoDB.findAll();
        alunoDB.close();
        return alunos;
    }

    //preenche os alunos na list view usando o adpter
    public void listViewAlunos(){
        ListAdapter adapter = new ArrayAdapter<Aluno>(context, android.R.layout.simple_list_item_1, getAlunos());
        lista.setAdapter(adapter);
    }

    //retorna uma instancia da list view
    public ListView getLista() {
        return lista;
    }

    //recebe uma instancia da list view
    public void setLista(ListView lista) {
        this.lista = lista;
    }
}

Gilmar, tudo bem ?

Entendi o que rolou, cara você recupera a lista, mas em nenhum momento você está atribuindo valores nela, ou seja em não está jogando um adapter para ela. Você até criou um método que faz isso, contudo não o utilizou.

Essa sua classe ParseViewAluno está um pouco confusa, lembra que no java, nós temos classes especialistas, nesse seu caso sua classe está com duas responsabilidades, interagir tanto com o formulário quanto listagem, o que não é muito interessante. Sugiro que você refatore, caso você queira realmente isolar o comportamento em classes separadas, você crie uma apenas para a listagem e outra apenas para o formulário.

Espero ter ajudado.

Abraços

solução!

Eu chamo o método que contem o adapter no método onResume(), os itens constam na lista, apenas estão da mesma cor do fundo. Quando é pressionado, a cor do fundo muda e por segundos consigo visualiza-los. Todas as funcionalidades estão rodando, o problema é no designer ou algo relacionado com relação ao aparelho físico, pois no emulador está perfeito.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software