滚动时ListView“回来”

时间:2013-07-17 12:47:51

标签: android listview android-listview

我在ListView中遇到了一个奇怪的行为,只有一个ListView,我的应用程序中有很多ListView,但只是在这种情况下才发生。

我会尝试解释,当我滚动到底部时,好吧,卷轴最后会停止。当我滚动到顶部时,它就像顶部的滚动条并回到底部。

this video显示了问题。

这是我的ListView的xml:

<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" />

以编程方式我只使用CustomAdapter设置了适配器,仅此而已。

我在其他ListViews中测试过,但我没有得到这种行为。

如果有人帮助我,我会很高兴。

[编辑]

这是我的适配器,它有点复杂,对不起,我试过保留所有内容但是在字符大小方面有一些限制:

[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);
            }
        }
    }
}

亲切的问候,

William Bertan

4 个答案:

答案 0 :(得分:3)

一些事情:

1)AsyncTask是超级越野车。首先,它总是被触发 - 当你进入getView时,静态变量永远不会成立 - 主线程不能同时位于notifyDataSetChangedgetView中!更重要的是,你正在改变主线程的Views,那是坏事,坏事,坏事。它充满了竞争条件,无论是针对您自己的代码还是针对框架。必须重做才能触及onPostExecute

中的视图

2)notifyDataSetChanged()中的代码似乎非常不稳定 - 您持有对View的引用,但如果我在执行onClick侦听器之前单击并滚动,则View可能不再出现在屏幕上。这是一个罕见的情况,被授予,但通常会不惜一切代价避免运行对任何ListView项目或子视图的引用。这必然会导致麻烦和/或内存泄漏(特别是在这种情况下,引用是静态的!)。

我不确定该错误的确切原因是什么,但是,如果我不得不猜测,我会说它是viewAux.setPressed/setSelected/requestFocus行。具体来说,requestFocus是超级可疑的 - Android会滚动窗口中的任何滚动容器,将焦点视图放在可见区域中。

3)从ListView中删除android:scrollXscrollY - 我很确定他们实际上并没有做任何事情,但即使他们这样做,也可能是错误的。

答案 1 :(得分:2)

@Delyan是对的。 我要补充一点,你在打破ListView时不应该破坏的所有“法律”。持有对循环视图的引用(来自getView方法)是你不应该做的事情,保持静态更糟糕!

撰写大部分ListView课程的Google工程师在谈到可能发生的奇怪事情:http://www.youtube.com/watch?v=wDBM6wVEO70 (你应该看到整个演示文稿,但跳到时间44:20)

答案 2 :(得分:0)

此行为也可能是由Android 5.1中的已知错误引起的。 See the bug report here

我已经能够在任何ListView上重现这一点,但滚动视图似乎表现正常。

答案 3 :(得分:0)

根据Varsha Bhatia的建议,我刚刚在我的ListView中添加了以下属性,这对我有用:

android:smoothScrollbar="true"
android:overScrollMode="never"

它可能对其他人有帮助。

谢谢:)