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

Dúvidas sobre atualização de listview com Spinner

Link de exemplo: https://github.com/BrunoLeonardoDev/listview

Eu tenho uma activity com uma listview onde eu fiz um adapter para preencher cada linha. Em cada linha desse listview eu tenho um codigo de produto e um spinner que escolho uma localização.

Quando eu escolho uma opção no spinner eu adiciono uma localização no produto e faço uma varredura na lista procurando produtos com o mesmo código, então atualizo a mesma localização neles. Eu automatizei esse processo pra facilitar pro usuário não precisar colocar manualmente a mesma localização em produtos iguais em todos os itens da lista, e esse processo já funciona.

O meu problema é que se eu tiver uma lista de produtos com o mesmo código de produto, o listview atualiza somente o último spinner.

Como faço para preencher adequadamente todos os itens?

Código completo do adapter que preencho o spinner:

package com.br.myapplication;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.List;

class ListaAdapter extends BaseAdapter {
    private List<Opcoes> listaOpcoes;
    private List<String> listaSpinner;
    private Context context;
    private ArrayAdapter<String> spAdapter;
    private String selecionado;
    private Spinner sp;
    private boolean userTouch;
    private int index;
    private int idlocal;

    public ListaAdapter(Context context, List<Opcoes> listaString, List<String> listaSpinner) {
        this.context = context;

        this.listaOpcoes = listaString;
        this.listaSpinner = listaSpinner;
    }

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

    @Override
    public Object getItem(int position) {
        return listaOpcoes.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = LayoutInflater.from(context).inflate(R.layout.item_lista, parent, false);

        TextView txt = view.findViewById(R.id.textView);
        final Opcoes opcao = listaOpcoes.get(position);
        txt.setText(opcao.getTexto());

        sp = view.findViewById(R.id.spinner);
        spAdapter = new ArrayAdapter<>(context,android.R.layout.simple_spinner_item,listaSpinner);
        spAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp.setAdapter(spAdapter);

        userTouch = false;
        sp.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                userTouch = true;
                return false;
            }
        });

       sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                int index = 0;
                String selecao = parent.getItemAtPosition(position).toString();
                if(userTouch) {
                    for (Opcoes r: listaOpcoes
                         ) {
                        r.setTextoSpinner(selecao);
                        Log.d("Spinner",String.valueOf(r.getTextoSpinner()));
                        index++;
                    }
                    userTouch = false;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        return view;
    }
}
5 respostas

Oi Bruno, tudo bem? O link do repositório que você passou não existe mais :(

Acho que eu não entendi muito bem a ideia, queria poder testar o projeto, você pode disponibilizar?

Consegui resolver. Mas não tem como excluir nem fechar o tópico.

Conta pra gente como você fez? Isso pode acabar ajudando mais pessoas ai a gente fecha o tópico com a sua solução.

solução!

Blz Wanderson. É porque eu fiz tanta coisa que não sei se cabia como solução aqui. Mas é o seguinte.:

Inicialmente eu utilizei a ListView, pois, apesar de ela não ter mais suporte achei que atenderia minha necessidade, já que minha lista podia ter no máximo 10 itens. Mas não obtive sucesso, mesmo pedindo ajuda em vários lugares.

Então segui a sugestão de um amigo para mudar para RecyclerView. Meu conhecimento de Android é bem básico e não tinha usado a RecyclerView até então, mesmo assim aprendi a usar. Mas pra alterar os elementos do RecyclerView é bem diferente do ListView, pois tive que aprender a fazer um listener e passar como parâmetro pro meu adapter, além de usar uma inteface com os objetos que precisavam ser atualizados. Fazendo isso eu consegui atualizar os elementos pela activity principal.

Não tentei fazer um listener usando a listview, portanto não sei dizer se teria funcionado, mas acabou que optei por usar a RecyclerView. Pra quem quer aprender programar pro android recomendo usar a listview somente para casos bem simples que não precisam de interação do usuário, mesmo que sejam poucos itens na lista.

Quem estiver insteressado em fazer o listener aqui na Alura eles abordam o assunto nas aulas de RecyclerView.

Show Bruno, sensacional! Obrigado por compartilhar com a gente a sua solução.