Solucionado (ver solução)
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.