Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ListView "coming back" when scrolling

I'm getting a strange behavior in the ListView, and only one ListView, I have a lot of ListViews in my app, but only in this is happening.

I will try explain, when I scroll to the bottom, all right, the scrolls go and stop in the end. When I scroll to the top, it's like the scroll splash in the top and come back to the bottom.

I have this video showing the problem.

This is my xml of the ListView:

<ListView
    android:id="@+id/lv_resultado_produtos"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="@color/Black"
    android:dividerHeight="1dip"
    android:fastScrollEnabled="true"
    android:scrollX="0dip"
    android:scrollY="0dip"
    android:scrollbarSize="22dip"
    android:scrollbarStyle="outsideOverlay" />

And programmatically I only set the Adapter with my CustomAdapter, nothing more.

I tested in others ListViews and I didn't get this behavior.

I will be glad if someone help me on this.

[EDIT]

Here is my Adapter, it's a little complex, sorry, I tried keep everything but have some limitation in size of characters:

[PACKAGE]

[IMPORTS]

public class CustomAdapter_Produto_Insercao extends ArrayAdapter<Produto_Insercao> {

    static View view_aux = null;

    static OnClickListener listener_convertView = null;
    static OnClickListener listener_btn_editar_produto = null;

    static Activity ctx;

    static Dialog_TW ad_estoque;

    static List<Condicao_Preco> list_tabela_preco_condicao;

    public static boolean clickable = true;

    public static boolean highlight = false;

    public static int linha_atual = 0;

    public static View view_atual = null;   

    static boolean id_margem = false;
    static boolean id_destaca_ipi = false;
    static String ls_id_tipo_regime;
    static Integer li_cd_cliente;

    static String caminho_foto;

    static DecimalFormat decimalFormat = null;

    static Repositorio repositorio;

    static Condicao_Preco c_p_null;

    static boolean inNotify = false;

    private final LayoutInflater inflater;

    private final int resourceId;

    public void setClickable(Boolean b){
        clickable = b;
    }

    public CustomAdapter_Produto_Insercao setId_margem(boolean id_margem){
        this.id_margem = id_margem;
        return this;
    }

    public CustomAdapter_Produto_Insercao setHighlight(boolean highlight){
        this.highlight = highlight;
        return this;
    }

    public CustomAdapter_Produto_Insercao setListener_convertView(OnClickListener listener){
        this.listener_convertView = listener;
        return this;
    }

    public CustomAdapter_Produto_Insercao setListener_btn_editar_produto(OnClickListener listener){
        this.listener_btn_editar_produto = listener;
        return this;
    }

    public CustomAdapter_Produto_Insercao(Activity context, int resource, List<Produto_Insercao> objects, List<Condicao_Preco> list_tabela_preco_condicao, String ls_id_tipo_regime, Integer li_cd_cliente) {

        super(context, resource, objects);

        ctx = context;

        this.list_tabela_preco_condicao = list_tabela_preco_condicao;

        this.inflater = LayoutInflater.from(context);
        this.resourceId = resource;
        this.ls_id_tipo_regime = ls_id_tipo_regime;
        this.li_cd_cliente = li_cd_cliente;

        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator(',');
        decimalFormatSymbols.setGroupingSeparator('.');     
        decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        repositorio = new Repositorio(ctx);
        String s_id_margem = repositorio.Parametro_getValue("id_margem");
        if(s_id_margem != null && s_id_margem.equals("S")){
            id_margem = true;
        }

        String s_id_destaca_ipi = repositorio.Parametro_getValue("id_destaca_ipi");
        if(s_id_destaca_ipi != null && s_id_destaca_ipi.equals("S")){
            id_destaca_ipi = true;
        }

        for(Produto_Insercao p_i : objects){
            if(p_i.getQt_pedida() == null || p_i.getQt_pedida() == 0d){
                p_i.setId_selecionado(false);
                p_i.setId_tabela_condicao_preco(-1);
                p_i.setCd_tabela_preco_condicao(-1);
            } else {
                p_i.setId_selecionado(true);
            }
        }

        caminho_foto = repositorio.Parametro_getValue("caminho_foto");

        c_p_null = new Condicao_Preco();
        c_p_null.setCd_condicao_preco(0);
        c_p_null.setCd_tabela_preco_condicao(0);
        c_p_null.setDs_condicao_preco("Selecione");
        c_p_null.setId_promocao("N");
        c_p_null.setId_fake(true);
    }

    private static class ViewHolder {
        public int     position;

        public TextView            cd_produto;
        public TextView            ds_produto;
        public TextView            ds_unidade;
        public Button              btn_vl_saldo;
        public Spinner             spn_tabela_condicao_preco;
        public TextView            vl_unidade_unitario;
        public TextView            vl_unitario;
        public Button              qt_produto_menos;
        public Button              qt_produto_mais;
        public EditText_Decimal_TW qt_produto;
        public TextView            vl_total;
        public Button              btn_editar_produto;
        public TextView            vl_custo;
        public TextView            pr_ipi;
        public ImageButton         foto_produto;

        public Button              mais_opcoes;
    }

    @Override
    public void notifyDataSetChanged() {
        inNotify = true;

        boolean b = false;
        if(view_aux != null && view_aux.isPressed()){
            b = true;
        } 

        super.notifyDataSetChanged();

        if(b){
            view_aux.requestFocus();
            view_aux.setPressed(true);
            view_aux.setSelected(true);
        }

        inNotify = false;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        final Produto_Insercao p = getItem(position);

        if(p.getCd_tabela_preco_condicao() == -1){
            p.setId_selecionado(false);
        } else {
            p.setId_selecionado(true);
        }

        if (convertView == null) {
            convertView = inflater.inflate(resourceId, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.cd_produto                = (TextView)            convertView.findViewById(R.id.cd_produto);
            viewHolder.ds_produto                = (TextView)            convertView.findViewById(R.id.ds_produto);
            viewHolder.ds_unidade                = (TextView)            convertView.findViewById(R.id.ds_unidade);
            viewHolder.btn_vl_saldo              = (Button)              convertView.findViewById(R.id.btn_vl_saldo);
            viewHolder.spn_tabela_condicao_preco = (Spinner)             convertView.findViewById(R.id.spn_tabela_condicao_preco);
            viewHolder.vl_unidade_unitario       = (TextView)            convertView.findViewById(R.id.vl_unidade_unitario);
            viewHolder.vl_unitario               = (TextView)            convertView.findViewById(R.id.vl_unitario);
            viewHolder.qt_produto_menos          = (Button)              convertView.findViewById(R.id.qt_produto_menos);
            viewHolder.qt_produto_mais           = (Button)              convertView.findViewById(R.id.qt_produto_mais);
            viewHolder.qt_produto                = (EditText_Decimal_TW) convertView.findViewById(R.id.qt_produto);
            viewHolder.vl_total                  = (TextView)            convertView.findViewById(R.id.vl_total);
            viewHolder.btn_editar_produto        = (Button)              convertView.findViewById(R.id.btn_editar_produto);
            viewHolder.vl_custo                  = (TextView)            convertView.findViewById(R.id.vl_custo);
            viewHolder.pr_ipi                    = (TextView)            convertView.findViewById(R.id.pr_ipi);
            viewHolder.foto_produto              = (ImageButton)         convertView.findViewById(R.id.foto_produto);

            viewHolder.mais_opcoes               = (Button)              convertView.findViewById(R.id.mais_opcoes);

            boolean id_mobile_utiliza_valor_unitario = false;
            String s_id_mobile_utiliza_valor_unitario = repositorio.Parametro_getValue("id_mobile_utiliza_valor_unitario");
            if(s_id_mobile_utiliza_valor_unitario != null && s_id_mobile_utiliza_valor_unitario.equals("S")){
                id_mobile_utiliza_valor_unitario = true;
            }
            if(!id_mobile_utiliza_valor_unitario){
                viewHolder.vl_unidade_unitario.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
                LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 13);
                viewHolder.mais_opcoes.setLayoutParams(ll);
            } else {
                LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 15);
                viewHolder.mais_opcoes.setLayoutParams(ll);
            }

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Repeater qt_produto_menos_repeater = new Repeater(viewHolder.qt_produto_menos);

        viewHolder.qt_produto_menos.setOnLongClickListener(qt_produto_menos_repeater);

        Repeater qt_produto_mais_repeater = new Repeater(viewHolder.qt_produto_mais);

        viewHolder.qt_produto_mais.setOnLongClickListener(qt_produto_mais_repeater);

        if(p.isId_liberado()){
            viewHolder.mais_opcoes              .setVisibility(View.GONE);

            viewHolder.qt_produto_menos         .setVisibility(View.VISIBLE);
            viewHolder.qt_produto_mais          .setVisibility(View.VISIBLE);
            viewHolder.qt_produto               .setVisibility(View.VISIBLE);
            viewHolder.spn_tabela_condicao_preco.setVisibility(View.VISIBLE);
            viewHolder.vl_unidade_unitario      .setVisibility(View.VISIBLE);
            viewHolder.vl_unitario              .setVisibility(View.VISIBLE);
            viewHolder.vl_total                 .setVisibility(View.VISIBLE);
            viewHolder.btn_editar_produto       .setVisibility(View.VISIBLE);
        } else {
            viewHolder.mais_opcoes              .setVisibility(View.VISIBLE);

            viewHolder.qt_produto_menos         .setVisibility(View.GONE);
            viewHolder.qt_produto_mais          .setVisibility(View.GONE);
            viewHolder.qt_produto               .setVisibility(View.GONE);
            viewHolder.spn_tabela_condicao_preco.setVisibility(View.GONE);
            viewHolder.vl_unidade_unitario      .setVisibility(View.GONE);
            viewHolder.vl_unitario              .setVisibility(View.GONE);
            viewHolder.vl_total                 .setVisibility(View.GONE);
            viewHolder.btn_editar_produto       .setVisibility(View.GONE);

            p.setId_liberado(false);
        }

        viewHolder.mais_opcoes.setOnClickListener(new OnClickListener() {           
            @Override
            public void onClick(View v) {
                p.setId_liberado(true);

                notifyDataSetChanged();
            }
        });

        viewHolder.position = position;

        if(!inNotify)
            new MyAsyncTask(position, viewHolder, convertView, p, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

        if(p.getQt_pedida() != null && p.getQt_pedida() > 0d){
            convertView.setBackgroundResource(R.color.DuaPi_Pressed);
        } else {
            convertView.setBackgroundResource(R.color.WhiteSmoke);
        }

        if(p.getVl_saldo() != null && p.getVl_saldo() > 0d){
            viewHolder.cd_produto                .setTextColor(Color.BLACK);
            viewHolder.ds_produto                .setTextColor(Color.BLACK);
            viewHolder.ds_unidade                .setTextColor(Color.BLACK);
            viewHolder.btn_vl_saldo              .setTextColor(Color.BLACK);
        } else {
            viewHolder.cd_produto                .setTextColor(Color.RED);
            viewHolder.ds_produto                .setTextColor(Color.RED);
            viewHolder.ds_unidade                .setTextColor(Color.RED);
            viewHolder.btn_vl_saldo              .setTextColor(Color.RED);
        }

        if(highlight && position == linha_atual){
            convertView.setBackgroundResource(R.color.DuaPi);
        } else {
            convertView.setBackgroundResource(R.drawable.listview_background);
        }

        return convertView;
    }

    private static class MyAsyncTask extends AsyncTask {

        private int              position;
        private ViewHolder       viewHolder;
        private View             convertView;
        private Produto_Insercao p;

        private List<Condicao_Preco>           lista_tabela_preco_condicao;
        private CustomAdapter_Produto_Insercao mAdapter;
        private SpinnerAdapter_Condicao_Preco  adapter;

        public MyAsyncTask(int position, ViewHolder viewHolder, View convertView, Produto_Insercao p, CustomAdapter_Produto_Insercao mAdapter) {
            this.position    = position;
            this.viewHolder  = viewHolder;
            this.convertView = convertView;
            this.p           = p;
            this.mAdapter    = mAdapter;

            lista_tabela_preco_condicao = new ArrayList<Condicao_Preco>();
        }

        @Override
        protected Object doInBackground(Object... params) {
            if(p.isId_liberado()){
                viewHolder.btn_editar_produto.setOnClickListener(new OnClickListener() {            
                    @Override
                    public void onClick(View v) {               
                        linha_atual = position;
                        view_atual  = convertView;

                        if(listener_btn_editar_produto != null){
                            listener_btn_editar_produto.onClick(v);
                        }
                    }
                });

                viewHolder.qt_produto_menos.setOnClickListener(new OnClickListener() {          
                    @Override
                    public void onClick(View v) {
                        view_aux = viewHolder.qt_produto_menos;

                        Double qt_anterior = viewHolder.qt_produto.getValor_Double();

                        viewHolder.qt_produto.setValor(viewHolder.qt_produto.getValor_Double() - p.getFator_venda());

                        //verifica se o produto não está na lista de itens do pedido, se tiver não deixa zerar...
                        if(PedidoTabActivity2.find_produto_em_itens(p.getCd_produto())){
                            if(viewHolder.qt_produto.getValor_Double() <= 0d){
                                viewHolder.qt_produto.setValor(qt_anterior);
                                return;
                            }
                        }

                        if(viewHolder.qt_produto.getValor_Double() < 0d){
                            viewHolder.qt_produto.setValor(0d);
                        }

                        p.setQt_pedida(viewHolder.qt_produto.getValor_Double());

                        calculaInformacoes(false);

                        if(!atualizaFLEX(p, 30)){
                            viewHolder.qt_produto.setValor(qt_anterior);
                            p.setQt_pedida(qt_anterior);
                            atualizaFLEX(p, 10);
                            calculaInformacoes(false);
                            return;
                        }
                    }
                });

                viewHolder.qt_produto_mais.setOnClickListener(new OnClickListener() {           
                    @Override
                    public void onClick(View v) {
                        view_aux = viewHolder.qt_produto_menos;

                        Double qt_anterior = viewHolder.qt_produto.getValor_Double();

                        viewHolder.qt_produto.setValor(viewHolder.qt_produto.getValor_Double() + p.getFator_venda());

                        p.setQt_pedida(viewHolder.qt_produto.getValor_Double());

                        calculaInformacoes(false);

                        if(!atualizaFLEX(p, 30)){
                            viewHolder.qt_produto.setValor(qt_anterior);
                            p.setQt_pedida(qt_anterior);
                            atualizaFLEX(p, 10);
                            calculaInformacoes(false);
                            return;
                        }
                    }
                });

                lista_tabela_preco_condicao.add(c_p_null);

                lista_tabela_preco_condicao.addAll(list_tabela_preco_condicao);

                if(p.getId_promocao() < 1){
                    for(int i = 0; i < lista_tabela_preco_condicao.size(); i++){
                        if(lista_tabela_preco_condicao.get(i).getId_promocao().equals("S")){
                            lista_tabela_preco_condicao.remove(i--);
                        }
                    }
                }

                OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {                   
                        selection(arg2);
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) {    
                    }
                };

                viewHolder.spn_tabela_condicao_preco.setOnItemSelectedListener(onItemSelectedListener);

                adapter = new SpinnerAdapter_Condicao_Preco(ctx, android.R.layout.simple_spinner_item, lista_tabela_preco_condicao, ls_id_tipo_regime, p.getCd_tabela_preco(), p.getCd_produto(), li_cd_cliente);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            }

            convertView.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    if(!clickable){
                        return ;
                    }

                    linha_atual = position;
                    view_atual  = convertView;

                    if(listener_convertView != null){
                        listener_convertView.onClick(v);
                    }

                    p.setId_liberado(true);

                    mAdapter.notifyDataSetChanged();
                }
            });

            viewHolder.btn_vl_saldo.setOnClickListener(new OnClickListener() {          
                @Override
                public void onClick(View v) {
                    if(ad_estoque != null){
                        return ;
                    }

                    ad_estoque = new Dialog_TW(ctx);

                    final Dialog_TW ad_estoque_temp = ad_estoque;
                    ad_estoque.setView(R.layout.layout_pedido_venda_tab_insercao_estoque);
                    ad_estoque.setTitle("Consulta de Estoque");
                    ad_estoque.setCancelable(false);

                    View view_estoque = ad_estoque.getView();

                    TextView ds_produto   = (TextView) view_estoque.findViewById(R.id.ds_produto);
                    Button   btn_ok       = (Button)   view_estoque.findViewById(R.id.btn_ok);
                    ListView lv_resultado = (ListView) view_estoque.findViewById(R.id.lv_resultado);
                    TextView vl_total     = (TextView) view_estoque.findViewById(R.id.vl_total);

                    ds_produto.setText(p.toString());

                    btn_ok.setOnClickListener(new OnClickListener() {                   
                        @Override
                        public void onClick(View v) {
                            ad_estoque_temp.getDialog(false, 50d).dismiss();
                        }
                    });

                    ad_estoque.setOnDismissListener(new OnDismissListener() {                               
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            ad_estoque = null;

                            if(CustomAdapter_Pedido_Venda_Pendente_Item_Rascunho.editar){
                                CustomAdapter_Pedido_Venda_Pendente_Item_Rascunho.editar = false;
                            }
                        }
                    }); 
                    Repositorio repositorio = new Repositorio(ctx);                             
                    List<Saldo_Estoque> lista_saldo_estoque = repositorio.generic_GetList(Saldo_Estoque.class, 
                                                                              "cd_produto = '" + p.getCd_produto() + "'",  
                                                                              null, 
                                                                              null, 
                                                                              null, 
                                                                              "cd_empresa asc", 
                                                                              false);
                    Double total = 0d;
                    for(Saldo_Estoque s_e : lista_saldo_estoque){
                        List<Empresa> lista_empresa = repositorio.generic_GetList(Empresa.class, 
                                                                                  "cd_empresa = '" + s_e.getCd_empresa() + "'",  
                                                                                  null, 
                                                                                  null, 
                                                                                  null, 
                                                                                  null, 
                                                                                  false);
                        Empresa e = null;
                        if(lista_empresa != null && lista_empresa.size() > 0){
                            e = lista_empresa.get(0);
                            s_e.setNm_reduzido(e.getNm_reduzido());
                        }
                        total += s_e.getQt_disponivel();
                    }
                    vl_total.setText(decimalFormat.format(total));

                    CustomAdapter_Estoque adapter_estoque = new CustomAdapter_Estoque(ctx, R.layout.layout_pedido_venda_tab_insercao_estoque_lista, lista_saldo_estoque).setHighlight(true);
                    lv_resultado.setAdapter(adapter_estoque);

                    ad_estoque.getDialog(false, 50d).show();                
                }
            });
            return null;
        }                   
        @Override
        protected void onPostExecute(Object result) {

            if(id_margem){
                viewHolder.vl_custo.setVisibility(View.VISIBLE);
                viewHolder.vl_custo.setText(p.getVl_custo_unitario() == null ? "-" : decimalFormat.format(p.getVl_custo_unitario()));
            }

            if(id_destaca_ipi){
                viewHolder.pr_ipi.setVisibility(View.VISIBLE);
                viewHolder.pr_ipi.setText(decimalFormat.format(p.getPr_ipi()));
            }

            if(caminho_foto != null && p.getId_foto() != null && p.getId_foto().equals("S")){
                viewHolder.foto_produto.setVisibility(View.VISIBLE);                
                viewHolder.foto_produto.setOnClickListener(new OnClickListener() {          
                    @Override
                    public void onClick(View v) {
                        Util.carregar_foto_produto(p.getCd_produto(), p.getDs_produto(), p.getNm_foto(), ctx);
                    }
                });
            }

            viewHolder.cd_produto  .setText(p.getCd_produto());
            viewHolder.ds_produto  .setText(p.getDs_produto());
            viewHolder.ds_unidade  .setText(p.getDs_unidade_unitaria());
            viewHolder.btn_vl_saldo.setText(decimalFormat.format(p.getVl_saldo()));

            if(p.isId_liberado()){
                if(p.isId_selecionado()){                   
                    Unidade u = null;                   
                    List<Unidade> lista_Unidade = repositorio.generic_GetList(Unidade.class, 
                              "cd_unidade = " + p.getCd_unidade_embalagem(),  
                              null, 
                              null, 
                              null, 
                              null, 
                              false);
                    if(lista_Unidade != null && lista_Unidade.size() > 0){
                        u = lista_Unidade.get(0);
                    }       
                    Double vl_unidade_unitario = Util.roundDouble(p.getVl_unitario() / (u != null ? u.getFator_conversao() : 1), 2);
                    viewHolder.vl_unidade_unitario.setText(decimalFormat.format(vl_unidade_unitario));
                    viewHolder.vl_unitario.setText(decimalFormat.format(p.getVl_unitario()));
                    viewHolder.vl_total   .setText(decimalFormat.format(p.getVl_total()));
                } else {
                    viewHolder.vl_unidade_unitario.setText(" - ");
                    viewHolder.vl_unitario        .setText(" - ");
                    viewHolder.vl_total           .setText(" - ");
                }

                viewHolder.qt_produto.setValor(p.getQt_pedida() == null ? 0d : p.getQt_pedida());

                viewHolder.spn_tabela_condicao_preco.setAdapter(adapter);

                if(lista_tabela_preco_condicao.size() > 1){
                    viewHolder.spn_tabela_condicao_preco.setEnabled(true);
                } else {
                    viewHolder.spn_tabela_condicao_preco.setEnabled(false);
                }

                if(p.isId_selecionado()){       
                    viewHolder.spn_tabela_condicao_preco.setSelection(find_Condicao_Preco_position(lista_tabela_preco_condicao, p.getCd_tabela_preco_condicao()));
                } else {
                    viewHolder.spn_tabela_condicao_preco.setSelection(0);
                }

                if(lista_tabela_preco_condicao == null || lista_tabela_preco_condicao.size() < 2){
                    viewHolder.btn_editar_produto.setEnabled(false);
                } else {
                    viewHolder.btn_editar_produto.setEnabled(true);
                }

                if(!p.isId_selecionado() && lista_tabela_preco_condicao.size() == 3){
                    adapter.getDropDownView(2, null, null);
                    viewHolder.spn_tabela_condicao_preco.setSelection(2);
                }
            }

            convertView.setClickable(true);
            convertView.setFocusable(true);
        }
        private Double calculaInformacoes_getVl_unitario(){     
            [ONLY CALCULATES THE VALUES]
        }                   
        private void calculaInformacoes(boolean calcula_Preco){ 
            [ONLY CALCULATES THE VALUES]
        }
        private boolean atualizaFLEX(Produto_Insercao p_i, int operacao) {
            [ONLY CALCULATES THE VALUES]
        }

        public Condicao_Preco find_Condicao_Preco(List<Condicao_Preco> lista, Integer cd_tabela_preco_condicao){
            for(Condicao_Preco c_p : lista){
                if(c_p.getCd_tabela_preco_condicao().equals(cd_tabela_preco_condicao)){
                    return c_p;
                }
            }       
            return null;
        }

        public Integer find_Condicao_Preco_position(List<Condicao_Preco> lista, Integer cd_tabela_preco_condicao){
            for(int i = 0; i < lista.size(); i++){
                Condicao_Preco c_p = lista.get(i);
                if(c_p.getCd_tabela_preco_condicao().equals(cd_tabela_preco_condicao)){
                    return i;
                }
            }       
            return null;
        }

        public void selection(Integer arg2){
            if(arg2 > 0){
                Condicao_Preco c_p = find_Condicao_Preco(lista_tabela_preco_condicao, p.getCd_tabela_preco_condicao());
                Condicao_Preco c_p_aux = lista_tabela_preco_condicao.get(arg2);                                     
                if(c_p == null || !c_p.getCd_tabela_preco_condicao().equals(c_p_aux.getCd_tabela_preco_condicao())){
                    if(p.getId_gera_flex().equals("S") && c_p_aux.getDs_condicao_preco().equals("Última Venda")){
                        if(c_p_aux.getDs_condicao_preco().equals("Última Venda")){
                            Util.MessageDialog_Ok(ctx, 
                                    ctx.getResources().getString(R.string.titulo_dialog_padrao), 
                                    "Produto que gera FLEX não pode ser selecionado 'Última Venda'.", Util.ICONE_INFORMATION);  
                        }           
                        p.setCd_tabela_preco_condicao(p.getCd_tabela_preco_condicao());                                 
                        mAdapter.notifyDataSetChanged();
                        return;
                    }                                       
                    if(c_p_aux.getVl_valor() != null){
                        p.setCd_tabela_preco_condicao(c_p_aux.getCd_tabela_preco_condicao());
                        p.setId_selecionado(true);
                        calculaInformacoes(true);
                    } else {
                        Util.MessageDialog_Ok(ctx, 
                                ctx.getResources().getString(R.string.titulo_dialog_padrao), 
                                "Não foi possível encontrar a última venda deste item para este cliente.", Util.ICONE_INFORMATION);
                        p.setCd_tabela_preco_condicao(p.getCd_tabela_preco_condicao());                                 
                        mAdapter.notifyDataSetChanged();
                    }
                }
            } else {
                p.setCd_tabela_preco_condicao(-1);
                p.setId_selecionado(false);
                calculaInformacoes(true);
            }
        }
    }
}

Kind Regards,

William Bertan

like image 406
William Da Silva Avatar asked Jul 17 '13 12:07

William Da Silva


Video Answer


1 Answers

Couple of things:

1) That AsyncTask is super buggy. First, it's always triggered - that static variable is never true when you're in getView - the main thread can't be both in notifyDataSetChanged and getView at the same time! More importantly, you're changing Views off the main thread and that is BAD, BAD, BAD. It's riddled with race conditions, both against your own code and against the framework. It has to be redone to only touch the Views in onPostExecute

2) Your code in notifyDataSetChanged() seems really flaky - you're holding a reference to a View but if I click and scroll before your onClick listener gets executed that View may no longer be on screen. It's a rare case, granted, but in general avoid at all costs running holding references to any of the ListView items or subviews. That's bound to cause trouble and/or memory leaks (especially in this case where the reference is static!).

I'm not sure what the exact cause of the bug is but, if I had to guess, I'd say it's the viewAux.setPressed/setSelected/requestFocus lines. Specifically, the requestFocus is super suspicious - Android scrolls any scrolling containers in the window to put the focused View in the visible area.

3) Remove android:scrollX and scrollY from the ListView - I'm pretty sure they don't actually do anything but even if they do, it's probably the wrong thing.

like image 179
Delyan Avatar answered Sep 28 '22 07:09

Delyan