Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
17
respostas

Adapter não clica

Fala, pessoal.

Na minha lista do adapter, ao clicar em um dos itens, não acontece nada (não aciona o método de clique para editar os itens da lista):

    private void configuraLista() {
        ListView listaDeVisitas = findViewById(R.id.lista_visitas_listview);
        final List<Visita> visitasFiltradas = listaVisitasView.listaDoAdapterFiltrado();
        listaDeVisitas.setAdapter(new ListaVisitasAdapter(visitasFiltradas, this));
        listaDeVisitas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Visita visitaClicada = visitasFiltradas.get(position);
                vaiParaEditaVisita(visitaClicada);
            }
        });
        registerForContextMenu(listaDeVisitas);
    }

    private void vaiParaEditaVisita(Visita visitaClicada) {
        Intent intent = new Intent(MainActivity.this,
                Cadastro_Visita.class);
        intent.putExtra(CHAVE_VISITA, visitaClicada);
        startActivity(intent);
    }

Não entendi o que poderia ser...

O "listaVisitasView" recebe uma lista filtrada, pois não aparecem todos os itens no adapter (tem um filtro).

PS: daqui a pouco chega o Matheus para salvar a pátria \o/ kkk

17 respostas

Fala ai Thiago, tudo bem ?

Onde você está chamando o método configuraLista() a principio não vi nada errado

Tudo bom!!!

Então, está assim:

public class MainActivity extends AppCompatActivity {

    private static final String TITULO_APPBAR = "Lista de visitas";
    private final ListaVisitasView listaVisitasView = new ListaVisitasView(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_visita);
        setTitle(TITULO_APPBAR);
        configuraLista();
        configuraBotoesMenu();
    }

Cara, tá bizarro

Tipo, a lista tá sendo exibida certinho ?

Nesse caso tá mais tenebroso porque não enxerguei nada fora do padrão, aparentemente tudo certo.

Talvez eu trocaria a referencia de onde está pegando o item, mas só pra não ter dependencia da listagem:

listaDeVisitas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Visita visitaClicada = (Visita) listaDeVisitas.getItemAtPosition(position);
                vaiParaEditaVisita(visitaClicada);
            }
        });

Rapaz, se vc disse que ficou tenebroso, fiquei com medo agora kkk

A lista está aparecendo normalmente.. muito estranho... Troquei também como pediu para teste e nada...

Até coloquei um botão para, invés de pegar pelo clique na lista, ser por ele, mas travei na hora de pegar a posição e passar para o botão, não consegui...

Deve ser feitiço

Pode mostrar o código completo da sua Activity, Adapter, XML e essa classe ListaVisitasView ?

Só pra gente de fato entender o problema ao todo.

Não repara o código que ainda não o refinei kkk

Main:

public class MainActivity extends AppCompatActivity {

    private static final String TITULO_APPBAR = "Lista de visitas";
    private final ListaVisitasView listaVisitasView = new ListaVisitasView(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_visita);
        setTitle(TITULO_APPBAR);
        configuraLista();
    }

    @Override
    protected void onResume() {
        super.onResume();
        listaVisitasView.atualizaVisitas();
    }

private void vaiParaEditaVisita(Visita visitaClicada) {
        Intent intent = new Intent(MainActivity.this, Cadastro_Visita.class);
        intent.putExtra(CHAVE_VISITA, visitaClicada);
        startActivity(intent);
    }

ListaVisitasView:

public class ListaVisitasView {

    private final ListaVisitasAdapter adapter;
    private final VisitaDAO dao;
    private final Context context;
    private List<Visita> visitas = new ArrayList<>();

    public ListaVisitasView(Context context) {
        this.context = context;
        //this.adapter = new ListaVisitasAdapter(this.context);
        this.adapter = new ListaVisitasAdapter(visitas, this.context);
        this.dao = new VisitaDAO();
    }

    public void atualizaVisitas() {
        adapter.atualiza(dao.todos());
    }

//    public void configuraAdapter(ListView listaDeVisitas) {
//        listaDeVisitas.setAdapter(adapter);
//    }

    public List<Visita> listaDoAdapterFiltrado(){
        return adapter.getVisitas();
    }

}

Adapter:

public class ListaVisitasAdapter extends BaseAdapter {

    private List<Visita> visitas;
    private final Context context;

    public ListaVisitasAdapter(List<Visita> visitas, Context context) {
        this.visitas = visitas;
        this.context = context;
    }

    @Override
    public int getCount() {
        return visitas.size();
    }

    @Override
    public Visita getItem(int posicao) {
        return visitas.get(posicao);
    }

    @Override
    public long getItemId(int posicao) {
        return visitas.get(posicao).getId();
    }


    @Override
    public View getView(int posicao, View view, ViewGroup viewGroup) {
        View viewCriada = criaView(viewGroup);
        Visita visita = visitas.get(posicao);
        vincula(viewCriada, visita);
        return viewCriada;
    }

    private View criaView(ViewGroup viewGroup) {
        return LayoutInflater.from(context)
                .inflate(R.layout.item_visita, viewGroup, false);
    }

    private void vincula(View view, Visita visita) {
        ImageView imagemFamilia = view.findViewById(R.id.item_foto_familia);
        imagemFamilia.setImageBitmap(visita.getFoto_familia());
        TextView unidade = view.findViewById(R.id.item_visita_unidade);
        unidade.setText(visita.getUnidade());
        TextView nome_crianca = view.findViewById(R.id.item_visita_nome_crianca);
        nome_crianca.setText(visita.getNome_crianca());
        TextView turma = view.findViewById(R.id.item_visita_turma);
        turma.setText(visita.getTurma());
        TextView turno = view.findViewById(R.id.item_visita_turno);
        turno.setText(visita.getTurno());
        TextView nome_responsavel1 = view.findViewById(R.id.item_visita_nome_responsavel_1);
        nome_responsavel1.setText(visita.getNome_responsavel_1());
        TextView telefone_responsavel1 = view.findViewById(R.id.item_visita_telefones);
        telefone_responsavel1.setText(visita.getTelefone_fixo_responsavel_1());
        TextView email_responsavel1 = view.findViewById(R.id.item_visita_email_responsavel_1);
        email_responsavel1.setText(visita.getEmail_responsavel_1());
        TextView situacao = view.findViewById(R.id.item_visita_situacao);
        situacao.setText(visita.getSituacao());
    }

    public void atualiza(List<Visita> visitas) {
        List<Visita> visitas_filtradas = new ArrayList<>();
        for (int i = 0; i < visitas.size(); i++) {
            if (visitas.get(i).getTurno().equals("Manhã"))
                visitas_filtradas.add(visitas.get(i));
        }
        this.visitas.clear();
        this.visitas.addAll(visitas_filtradas);
        notifyDataSetChanged();
    }

    public List<Visita> getVisitas() {
        return visitas;
    }
}

Item Visita do adapter:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

    <androidx.cardview.widget.CardView
        android:id="@+id/cardview_imagem_familia"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        app:cardCornerRadius="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

O CÓDIGO TÁ GRANDE.... AÍ VEM ALGUNS CAMPOS, COMO:

<TextView
                android:id="@+id/item_visita_unidade"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginTop="16dp"
                android:text="TextView"
                android:textSize="24sp"
                android:textStyle="bold"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/item_foto_familia"
                tools:text="Buritis" />

            <TextView
                android:id="@+id/item_visita_nome_crianca"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="TextView"
                android:textSize="18sp"
                app:layout_constraintStart_toStartOf="@+id/item_visita_unidade"
                app:layout_constraintTop_toBottomOf="@+id/item_visita_unidade"
                tools:text="Criança: Thiago Ornelas Cota" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.cardview.widget.CardView>

</androidx.constraintlayout.widget.ConstraintLayout>

Tem alguns pontos que não entendi, mas acho que o fato de você ter 2 instâncias do adapter pode estar causando algo.

A sua classe ListaVisitasView está meio estranha, pode ser que o problema esteja nela.

Se você não se importar de colocar o código no github, também ajudaria, pois assim conseguiria roda-lo e ver se acho o problema

Pronto: https://github.com/thiagornela/visita

solução!

rapaz, consegui resolver aqui

Entendi depois de ver o layout hehehe

o seguinte, sua lista tinha botões nela, em cada item, o botão ele segura o focus de click, o que fazia com que seu item não pudesse ser clicado.

O que você precisa fazer pra solucionar ? basta chegar nas tags botões e adicionar um atributo :

android:focusable="false"

Precisa estar em todos os botões que você for adicionar em cada card :)

Hahaha. Rapaz, não sabia disso.

E se eu precisar abrir o cadastro pelo botão e não pelo clique na lista. Como posso pegar o posição e enviar ao botão? Tentei mudar o código para fazer assim e testar qual era o problema, mas travei ao tentar pegar a posição.

Thiago,

Se entendi bem, você quer que o botão de cada item da sua lista de visitas ao ser clicado saiba qual é a visita correspondente, certo ?

Você em tese não precisa da posição, você na hora de definir o comportamento no seu adapter, você tem o método vincula nele já tem qual é a visita .

Não entendi rsrs. Seria isso mesmo.

Button teste = findViewById(R.id.item_button_editar);
        teste.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, Cadastro_Visita.class);
                intent.putExtra(CHAVE_VISITA, ????????);
                startActivity(intent);
            }
        });

Por exemplo, nos pontos de interrogação acima, como passo o parâmetro? É aí que não estou entendendo

Outra coisa, fiz várias pesquisas e não consegui localizar um meio de, ao abrir o formulário no modo de edição, atribuir o valor do AutoCompleteTextView cadastrado.

Como no campo Turma.

Parece que é:

spinnerTurma_irmao.getEditableText().setFilters()

Mas não entendi como preencher o inputFilter. Poderia me auxiliar também, por favor.

    private void vincula(View view, Visita visita) {
        ImageView imagemFamilia = view.findViewById(R.id.item_foto_familia);
        imagemFamilia.setImageBitmap(visita.getFoto_familia());
        TextView unidade = view.findViewById(R.id.item_visita_unidade);
        unidade.setText(visita.getUnidade());
        TextView nome_crianca = view.findViewById(R.id.item_visita_nome_crianca);
        nome_crianca.setText(visita.getNome_crianca());
        TextView turma = view.findViewById(R.id.item_visita_turma);
        turma.setText(visita.getTurma());
        TextView turno = view.findViewById(R.id.item_visita_turno);
        turno.setText(visita.getTurno());
        TextView nome_responsavel1 = view.findViewById(R.id.item_visita_nome_responsavel_1);
        nome_responsavel1.setText(visita.getNome_responsavel_1());
        TextView telefone_responsavel1 = view.findViewById(R.id.item_visita_telefones);
        telefone_responsavel1.setText(visita.getTelefone_fixo_responsavel_1());
        TextView email_responsavel1 = view.findViewById(R.id.item_visita_email_responsavel_1);
        email_responsavel1.setText(visita.getEmail_responsavel_1());
        TextView situacao = view.findViewById(R.id.item_visita_situacao);
        situacao.setText(visita.getSituacao());
// tudo que voce tinha

        Button teste = view.findViewById(R.id.item_button_editar);
        teste.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, Cadastro_Visita.class);
                intent.putExtra(CHAVE_VISITA, visita);
                startActivity(intent);
            }
        });

    }

o ideial é abrir outro tópico, vamos matar esse e depois a gente olha o outro, pode ser ?

Rapaz, então faço o comando na classe adapter? Estava fazendo no main... por isso kkkkkkkkkkkkkkk

Vou abrir outro tópico.

Obrigado novamente.