Listview updating when scrolling the page

Asked

Viewed 73 times

0

Well this happening something very crazy, in a list I have several items where I can change values, but when I increment these values and scroll the screen down and up the values are zeroed.

Another problem is when I go out and back to screen it Zera again all optional that had already filled out previously.

inserir a descrição da imagem aqui

When I search the items and returns successfully mount the screen like this:

    private void sucessoResposta(String resposta) {

    RetornoComida retornoComida;

    try
    {
        // Desserializa a resposta
        retornoComida = JSONParser.parseComida(resposta);

        // Conseguiu desserializar a resposta, verifica se houve sucesso
        if (retornoComida.isSucesso())
        {
            txtTitulo.setText(retornoComida.getComida().getTituloComida());
            txtIngredientes.setText(retornoComida.getComida().getComposicaoComida());
            Picasso.with(this).load(retornoComida.getComida().getUrlImagem()).placeholder(R.drawable.ic_launcher).into(imgPrato);
            comidaAdicionar = retornoComida.getComida();

            comidaAdicionar.setMeia(retornoComida.getComida().isMeia());
            comidaAdicionar.setMeiaMaior(retornoComida.getComida().isMeiaMaior());

            tamanhos = retornoComida.getComida().getTamanhos();

            adapter = new GenericAdapter<>(this, tamanhos,R.layout.item_tamanho);
            adapter.setOnGetViewEvent(this);
            lstItens.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            lstItens.setAdapter(adapter);
        }
        else
        {
            // Exibe a mensagem de erro
            MessageUtil.showError(this,
                    ResourceUtil.getString(retornoComida.getMensagem()));
        }
    }
    catch (Exception e)
    {
        // Falha ao desserializar objeto, exibe uma mensagem
        MessageUtil.showError(this, R.string.erro_desconhecido);
        return;
    }
}

I have the option selects options that look like this:

@Click(R.id.btnEscolherOpcionais)
public void escolherOpcionais() {
    if (tamanhoDaComida == null) {
        MessageUtil.showError(this, R.string.erro_selecione_o_tamanho);
        return;
    }

    Globales.getPedido().setCodRestaurante(restaurante.getCodigoRestaurante());
    Globales.getPedido().setCodCliente(Integer.valueOf(PreferencesUtils.getString(this,PreferencesUtils.PREFERENCIA_CODIGO_CLIENTE)));
    Intent intentEscolherOpcionais = new Intent(this, EscolherOpcionaisActivity_.class);
    intentEscolherOpcionais.putExtra(EscolherOpcionaisActivity.COMIDA, comidaAdicionar);
    intentEscolherOpcionais.putExtra(EscolherOpcionaisActivity.TAMANHO, tamanhoDaComida);
    intentEscolherOpcionais.putExtra(EscolherOpcionaisActivity.RESTAURANTE, restaurante);
    startActivityForResult(intentEscolherOpcionais, 0);
}

My Optionals Pick option is like this:

Method init();

    @AfterViews
public void init() {
    mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    comida = (Comida) getIntent().getSerializableExtra(COMIDA);
    tamanho = (Tamanho) getIntent().getSerializableExtra(TAMANHO);
    restaurante = (Restaurante) getIntent().getSerializableExtra(RESTAURANTE);
    configurarOpcionais();
}

Method adicionarOpcionais();

private void adicionarOpcional(Opcional opcional, Integer quantidade) {

    OpcaoPedido opcao = new OpcaoPedido();
    opcao.setCodRestauranteOpcao(opcional.getCodRestauranteOpcao());
    opcao.setValorUnitario(opcional.getValorOpcao());
    opcao.setQuantidade(quantidade);
    opcao.setCdPedidoItemOpcao(opcional.getCdPedidoItemOpcao());
    opcao.setVlTotal(opcional.getValorOpcao() * quantidade);
    opcao.setCdPedidoItemOpcao(opcional.getCodRestauranteOpcao());

    listaOpcionais.add(opcao);
}

To activity complete is like this:

@EActivity(R.layout.activity_opcionais)
public class EscolherOpcionaisActivity extends ActionBarActivity implements
    GenericAdapter.OnGetViewListener<Opcional> {

public static final String TAMANHO = "tamanho_obj";
public static final String RESTAURANTE = "resturante_obj";
public static final String COMIDA = "comida_obj";

Toolbar mToolbar;

@ViewById
ListView lstOpcionais;


@ViewById
TextView txtItensCarrinho;

GenericAdapter<Opcional> adapter;

List<Spinner> spinnersItens;
Tamanho tamanho;
Pedido pedido;
ItemPedido itemPedido;
Restaurante restaurante;
Comida comida;

@ViewById
LinearLayout emptyView;

String prato;

List<OpcaoPedido> listaOpcionais = new ArrayList<OpcaoPedido>();

@Click(R.id.lytCarrinho)
public void carrinho(){
    Intent intentCarrinho = new Intent(this, CarrinhoActivity_.class);
    startActivity(intentCarrinho);
}

@AfterViews
public void init() {
    mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    comida = (Comida) getIntent().getSerializableExtra(COMIDA);
    tamanho = (Tamanho) getIntent().getSerializableExtra(TAMANHO);
    restaurante = (Restaurante) getIntent().getSerializableExtra(RESTAURANTE);
    configurarOpcionais();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_opcionais, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // Pega todos os opcionais escolhidos
    int views = lstOpcionais.getChildCount();
    int i = 0;

    if (views > 0) {
        while (i < views) {
            OpcionalHolder tOlderHolder = (OpcionalHolder) lstOpcionais.getChildAt(i)
                    .getTag();
            Integer quantidade = Integer.valueOf(tOlderHolder.txtQuantidade.getText().toString());
            if(quantidade > 0){
                Opcional opcional = adapter.getItem(i);
                adicionarOpcional(tOlderHolder.opcional, quantidade);
            }
            i++;
        }
    }
    Intent data = new Intent();
    data.putExtra("OPCIONAIS", (Serializable) listaOpcionais);
    setResult(RESULT_OK, data);
    finish();
    return super.onOptionsItemSelected(item);
}

private void configurarOpcionais() {
    adapter = new GenericAdapter<>(this, tamanho.getOpcionais(),
            R.layout.item_opcional);
    adapter.setOnGetViewEvent(this);
    lstOpcionais.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    lstOpcionais.setAdapter(adapter);
    lstOpcionais.setEmptyView(emptyView);
    lstOpcionais.invalidate();
}

@Override
public void onGetView(final Opcional item, View view, boolean isNewView,
        int position) {
    try {
        final OpcionalHolder viewHolder;

        // Verifica se há uma nova view que foi inflada agora
        if (isNewView) {
            // Caso seja uma nova view, criamos o holder e encontramos todos
            // elementos do layout
            viewHolder = new OpcionalHolder();
            viewHolder.txtOpcional = (TextView) view
                    .findViewById(R.id.txtOpcional);
            viewHolder.txtQuantidade = (TextView) view
                    .findViewById(R.id.txtQuantidade);
            viewHolder.btnRemover = (Button) view
                    .findViewById(R.id.btnRemover);
            viewHolder.btnAdicionar = (Button) view
                    .findViewById(R.id.btnAdicionar);

            // Guarda na tag
            view.setTag(viewHolder);
        } else {
            // Caso seja uma view que esta sendo reutilizada, obtemos o
            // cache do findview
            viewHolder = (OpcionalHolder) view.getTag();
        }

        Money preco = new Money(BigDecimal.valueOf(item.getValorOpcao()));
        viewHolder.txtOpcional.setText(item.getTituloOpcao() + " - "
                + preco.toString());

        viewHolder.txtQuantidade.setText("0");
        //viewHolder.btnRemover.setEnabled(false);

        viewHolder.btnRemover.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Decrementa a quantidade
                int quantidade = Integer.valueOf(viewHolder.txtQuantidade
                        .getText().toString());
                if (quantidade > 0) {
                    removerOpcional(item);
                    quantidade--;
                    viewHolder.txtQuantidade.setText(String
                            .valueOf(quantidade));
                }

            }
        });

        viewHolder.btnAdicionar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Incrementa a quantidade
                int quantidade = Integer.valueOf(viewHolder.txtQuantidade
                        .getText().toString());
                if (quantidade < 99) {
                    quantidade++;
                    viewHolder.txtQuantidade.setText(String
                            .valueOf(quantidade));
                }
            }
        });
        viewHolder.opcional = item;

    } catch (Exception e) {
        NegocioLog.inserir(Log.AVISO, e);
    }
}

@Override
public void onResume(){
    super.onResume();
}

private void adicionarOpcional(Opcional opcional, Integer quantidade) {

    OpcaoPedido opcao = new OpcaoPedido();
    opcao.setCodRestauranteOpcao(opcional.getCodRestauranteOpcao());
    opcao.setValorUnitario(opcional.getValorOpcao());
    opcao.setQuantidade(quantidade);
    opcao.setCdPedidoItemOpcao(opcional.getCdPedidoItemOpcao());
    opcao.setVlTotal(opcional.getValorOpcao() * quantidade);
    opcao.setCdPedidoItemOpcao(opcional.getCodRestauranteOpcao());

    listaOpcionais.add(opcao);
}

private void removerOpcional(Opcional item) {

}
}

I will try to add more details to the question as I discover.

  • The problem must be in the implementation of Adapter, ask the question.

  • just a minute ...

  • @how do I get to my Adapter, because in the folder there is nothing

  • Put the method OnGetViewEvent(), I think that’s the name

  • I’ll look here

  • I checked something different. It’s another code that is doing the listing I will add the answer

  • updated the question

  • This is the normal functioning of listview, it recreates the view . To deal with it you’ll have to create a Custom Adapter

  • Puts kkk, can help me ?

  • @Luangabriel is not because of this no, I did the custom Adapter and nothing mudlu

  • Voce validates in your getView()if the convertViewis null?

  • no, actually this was already done I’m just giving maintenance

  • do this if validation (isNewView) {

  • has more opinion @Luangabriel

  • @Luangabriel my problem is in the method onGetView, until I solved the problem of 0, only that when I roll now the value I put in one iten goes to another

Show 10 more comments
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.