ListView com ArrayAdapter

Olá pessoal sou novato em Android e estou com uma dúvida de sobrescrita de dados no listview que ainda não consegui encontrar. Tenho uma Tabbed com 3 tabs, e ao clicar a primeira vez na tab aparece o listview corretamente porém ao trocar de tab e retornar para Tab do listview ele duplica os dado!

public class TabAgendaFerramentas extends Fragment{

public static Context context;

//Início código ref. ListView com checkbox
public ListView listViewFerramentas;
public ArrayList<String> arrayListFerramentas=new ArrayList<>();
//Fim código ref. ListView com checkbox

String campoSituacaoAgenda = "ABERTA";


View view;
public TabAgendaFerramentas(){}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.tabagendaferramentas, container, false);


    //Inicio método chama menu tabFerramentas
    setHasOptionsMenu(true);
    //Fim método chama menu tabFerramentas

    //Chamar listar ferramentas
    listarFerramentas();
    //Fim chamar listar ferramentas

    return view;
} 

public void listarFerramentas(){
    listViewFerramentas = (ListView) view.findViewById(R.id.listview);
    listViewFerramentas.setAdapter(null);
    List<ModeloFerramentas> modeloferramentas = new FerramentaController(getContext()).listarFerramenta();
    for (ModeloFerramentas ferramenta : modeloferramentas) {
        int id = ferramenta.getIdFerramenta();
        String nomeFerramenta = ferramenta.getNomeFerramenta();
        float valorFerramenta = ferramenta.getValorFerramenta();

        arrayListFerramentas.add("CÓD: " + id + " FERRAMENTA: " + nomeFerramenta + "\n" + "R$: " + valorFerramenta);
    }
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_multiple_choice, android.R.id.text1, arrayListFerramentas);
    listViewFerramentas.setAdapter(adapter);


}  

//Na imagem abaixo eu mudei de tab e voltei para ferramenta onde duplicou as ferramentas

Acredito que eu tenha encontrado o problema: Anteriormente eu estava utilizando em minhas Tabs “SectionsPagerAdapter” e meio que personalizadas. Reformulei elas utilizando “FragmentStatePagerAdapter” e o problema sumiu. Não sei dizer se o problema em si era o adapter ou algo das tabs.

ANTES: …mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.containeragendamento);
    mViewPager.setAdapter(mSectionsPagerAdapter);



    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.containeragendamento);
    mViewPager.setAdapter(mSectionsPagerAdapter);

DEPOIS: … public class PagerAdapter extends FragmentStatePagerAdapter {

//integer to count number of tabs
int tabCount;

//Constructor to the class
public PagerAdapter(FragmentManager fm, int tabCount) {
    super(fm);
    //Initializing tab count
    this.tabCount= tabCount;
}

Se solucionou, ótimo! Hahahah

Mas acredito que o fato dos dados estarem sendo duplicados seria por conta de você estar chamando o método listarFerramentas() todas as vezes que cria a view da sua Tab. Por exemplo, você tem uma lista de String global dentro do seu Fragment e, sempre que essa view é criada (no método onCreateView()) o método de listar é chamado, fazendo com que todas as ferramentas sejam novamente adicionadas à sua lista global!

A ideia de resolução para isso seria fazer a clássica limpeza da lista antes de iniciar a operação, ou seja, no inicio do método listarFerramentas() você pode executar um arrayListFerramentas.clear(), assim tudo que estava contido na lista antes será removido para que os itens sejam novamente adicionados, evitando, assim, que os itens sejam adicionados de forma duplicada.

Caso realmente essa seja a causa do problema esta é uma boa forma de resolve-lo. :slight_smile:

1 curtida