[RESOLVIDO] - ListView - Adater Customizado - Mudando a cor de um item, o ListView muda de outros ao mesmo tempo de forma aleatória

Boa noite.

Estou implementando um ListView em que, no ArrayAdapterCustomizado eu mudo a cor de um item (quando ele é nulo). O problema é que, quando eu rolo o ListView, outros itens que não tem nada a ver com o que eu mudei a cor, acaba sendo mudado a cor deles tbm.

Alguém sabe como resolve um problema desses? Abaixo segue o código:

NO ITEM:

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

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/cor_cinza_claro">

        <TextView
            android:id="@+id/turma"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:textAlignment="textEnd"
            android:textColor="@color/cor_verde"
            android:textSize="18sp"
            android:textStyle="bold|italic"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/turno"
            android:layout_width="0dp"
            android:layout_height="20dp"
            android:textAlignment="textEnd"
            android:textColor="@color/cor_lilas"
            android:textSize="14sp"
            android:textStyle="bold|italic"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/turma"
            app:layout_constraintTop_toBottomOf="@+id/turma" />

        <TextView
            android:id="@+id/horario"
            android:layout_width="0dp"
            android:layout_height="20dp"
            android:textAlignment="textEnd"
            android:textColor="@color/cor_azul"
            android:textSize="12sp"
            android:textStyle="bold|italic"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/turno"
            app:layout_constraintTop_toBottomOf="@+id/turno" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

NO ARRAYADAPTERCUSTOMIZADO:

 @Override
 public View getView(final int position, View view, ViewGroup parent){
      if(view == null){
           LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
           view = layoutInflater.inflate(R.layout.item_turma, null);
      }

      turma = arrayList.get(position);// turma do arrayList segundo essa posição

      banco = new BancoDeDados(context);
      horario = banco.consultarHorarioPeloIdBanco(turma.getFkHorario());

      TextView tvTurma = view.findViewById(R.id.turma);// Pega o view TextView "turma" pelo seu id, que está no layout inflado pela "view" e atribui ao TextView tvNome
      TextView tvHorario = view.findViewById(R.id.horario);// Pega o view TextView "horario" pelo seu id, que está no layout inflado pela "view" e atribui ao TextView tvHorario
      TextView tvTurno = view.findViewById(R.id.turno);// Pega o view TextView "turno" pelo seu id, que está no layout inflado pela "view" e atribui ao TextView tvTurno

      if(horario == null){
           tvTurma.setText(turma.getTurma());// Seta o Textview tvTurma passando o parâmetro turma.getTurma() que é o nome da turma da referente posição (position)
           tvHorario.setText(R.string.associe_ao_horario);// Seta o Textview tvHorario passando a String R.string.associe_ao_horario
           tvHorario.setTextColor(context.getColor(R.color.cor_vermelha));// Quando o horario é null, ele muda o tvTurno para esta cor personalizada
           tvTurno.setText(R.string.associe_ao_turno);// Seta o Textview tvHorario passando a String R.string.associe_ao_turno
           tvTurno.setTextColor(context.getColor(R.color.cor_vermelha));// Quando o turno é null, ele muda o tvTurno para esta cor personalizada
      }
      else if(horario != null){
           turno = banco.consultarTurnoPeloIdBanco(horario.getFkTurno());
           if(turno == null){
                tvTurma.setText(turma.getTurma());// Seta o Textview tvTurma passando o parâmetro turma.getTurma() que é o nome da turma da referente posição (position)
                tvHorario.setText(horario.getHoraInicial() + " às " + horario.getHoraFinal());// Seta o Textview tvHoraInicial passando o parâmetro a concatenação horario.getHoraInicial()+" às "+horario.getHoraFinal()
                tvTurno.setText(R.string.associe_ao_turno);// Seta o Textview tvHorario passando a String R.string.associe_ao_turno
                tvTurno.setTextColor(context.getColor(R.color.cor_vermelha));// Quando o turno é null, ele muda o tvTurno para esta cor personalizada
           }
           else{
                tvTurma.setText(turma.getTurma());// Seta o Textview tvTurma passando o parâmetro turma.getTurma() que é o nome da turma da referente posição (position)
                tvHorario.setText(horario.getHoraInicial() + " às " + horario.getHoraFinal());// Seta o Textview tvHoraInicial passando o parâmetro a concatenação horario.getHoraInicial()+" às "+horario.getHoraFinal()
                tvTurno.setText(turno.getNomeTurno());// Seta o Textview tvTurno passando o parâmetro turno.getNomeTurno() que é o nome do turno da referente posição (position)
           }
      }
      else{
           turno = banco.consultarTurnoPeloIdBanco(horario.getFkTurno());
           tvTurma.setText(turma.getTurma());// Seta o Textview tvTurma passando o parâmetro turma.getTurma() que é o nome da turma da referente posição (position)
           tvHorario.setText(horario.getHoraInicial() + " às " + horario.getHoraFinal());// Seta o Textview tvHoraInicial passando o parâmetro a concatenação horario.getHoraInicial()+" às "+horario.getHoraFinal()
           tvTurno.setText(turno.getNomeTurno());// Seta o Textview tvTurno passando o parâmetro turno.getNomeTurno() que é o nome do turno da referente posição (position)
      }

      return view;
 }

NO LSITVIEW:

public void listarTurma(){
      Cursor resultado = banco.listarTurmasBanco();// Retorna todos as turmas que estão no Banco de Dados

      if(resultado.getCount() == 0){
           Toast.makeText(this, R.string.lista_vazia, Toast.LENGTH_SHORT).show();
           finish();
      }
      else{
           while(resultado.moveToNext()){
                String idTurma = resultado.getString(resultado.getColumnIndex("ID_TURMA"));
                String nomeTurma = resultado.getString(resultado.getColumnIndex("NOME_TURMA"));
                int limiteTurma = resultado.getInt(resultado.getColumnIndex("LIMITE_ALUNOS"));
                String idHorario = resultado.getString(resultado.getColumnIndex("FK_HOR_TURMA"));

                turma = new Turma(idTurma, nomeTurma, limiteTurma, idHorario);// Instância da turma

                arrayList.add(turma);// Inserção do aluno no arrayList de turmas
                arrayAdapterCustTurma = new ArrayAdapterCustTurma(this, arrayList);// Instância do ArrayAdapter passando o contexto e o arrayList
//                    arrayAdapterCustTurma.notifyDataSetChanged();
                listView.setAdapter(arrayAdapterCustTurma);// O listView é setado passando como parâmetro o arrayAdapterCustTurma

                qnt = arrayAdapterCustTurma.getCount();// Quantidade de Turma na Lista
                tvQntTurma.setText(qnt + " Turmas");// tvQntTurma setado para exibir a quantidade de turmas

                listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                     @Override
                     public void onItemClick(AdapterView<?> parent, final View view, final int posicao, long id){
                          turma = arrayAdapterCustTurma.getItem(posicao);// Turma Clicada na Lista

                          AlertDialog.Builder box = new AlertDialog.Builder(ListarRamoverTurmas.this);// Instância da caixa de diálogo BOX do tipo AlertDialog.Builder
                          box.setIcon(R.drawable.icone_ok);
                          box.setTitle(R.string.turma);
                          box.setMessage(turma.imprimeDadosTurma(ListarRamoverTurmas.this));// Exibe os dados do turma pelo método imprimeDadosTurma(contexto) na mensagem do box

                          box.setPositiveButton(R.string.remover, new DialogInterface.OnClickListener(){
                               @Override
                               public void onClick(DialogInterface dialogInterface, int which){
                                    AlertDialog.Builder box = new AlertDialog.Builder(ListarRamoverTurmas.this);// Instância da caixa de diálogo BOX do tipo AlertDialog.Builder
                                    box.setMessage(R.string.confirmar_exclusao);

                                    box.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener(){
                                         @Override
                                         public void onClick(DialogInterface dialog, int which){
                                              if(banco.removerTurmaBanco(turma.getIdTurma()+"")){/**<MÉTODO QUE REMOVE A TURMA DO BANDO DE DADOS E RETORNA UM VALOR BOOLEAN**/
                                                   arrayList.remove(posicao);// Remove a turma do arrayList para não ser exibido no listview quando ele for removido do Bando de Dados
                                                   arrayAdapterCustTurma.notifyDataSetChanged();// ATUALIZA O LISTVIEW QUANDO UM ITEM É REMOVIDO (SÓ O .remove(position) NÃO ESTAVA FUNCIONANDO PERFEITAMENTE)

                                                   qnt = arrayAdapterCustTurma.getCount();// Quantidade de Turma na Lista
                                                   if(qnt == 0){
                                                        finish();// Se a quantidade de turmas for zero, a activity é fechada
                                                   }
                                                   else{
                                                        tvQntTurma.setText(qnt + " Turmas");// Se a quantidade de turmas for diferente zero, esse valor é exibido na activity
                                                   }

                                                   Toast.makeText(ListarRamoverTurmas.this, R.string.turma_removida_sucesso, Toast.LENGTH_SHORT).show();
                                              }
                                              else{
                                                   Toast.makeText(ListarRamoverTurmas.this, R.string.turma_nao_removida, Toast.LENGTH_SHORT).show();
                                              }
                                         }
                                    });

                                    box.setNegativeButton(R.string.cancelar, new DialogInterface.OnClickListener(){
                                         @Override
                                         public void onClick(DialogInterface dialog, int which){
                                              Intent intent = new Intent(getApplicationContext(), InterfaceTurma.class);// Intent que volta para a Activity InterfaceTurma
                                              startActivity(intent);
                                              Toast.makeText(ListarRamoverTurmas.this, R.string.turma_removida_sucesso, Toast.LENGTH_SHORT).show();
                                         }
                                    });

                                    box.show();
                               }
                          });

                          box.setNegativeButton(R.string.voltar_menu, new DialogInterface.OnClickListener(){
                               @Override
                               public void onClick(DialogInterface dialog, int which){
                                    Intent intent = new Intent(getApplicationContext(), InterfaceTurma.class);// Intent que volta para a Activity InterfaceTurma
                                    startActivity(intent);
                                    finish();
                               }
                          });

                          box.show();
                     }
                });
           }
      }
 }

OS setText() FUNCIONAL, MAS setTextColor() NÃO. ELE TEM ESSE COMPORTAMENTO QUE FALEI.

DESDE JÁ, MT OBRIGADA A TODOS!

Obg.

Vi o conteúdo, mas oq eu quero msm é saber o pq meu listview está tendo esse comportamento e como resolvê-lo ou evitá-lo.

Alguém? Desde já mt obg!

RESOLVIDO! Tão simples… NO ADAPTER, TIREI DO “if”!

ESTAVA ASSIM:

  if(view == null){
       LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
       view = layoutInflater.inflate(R.layout.item_turma, null);
  }

DEIXEI ASSIM:

       LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
       view = layoutInflater.inflate(R.layout.item_turma, null);

FICA AÍ PRA QUEM ENCONTRAR O MESMO PROBLEMA.