6

ListView で奇妙な動作が発生しています。ListView は 1 つだけです。アプリには多くの ListView がありますが、これだけで発生しています。

説明してみますが、一番下までスクロールすると、スクロールが進み、最後に止まります。一番上までスクロールすると、スクロールが上に飛び散って下に戻ってくるようなものです。

問題を示すこのビデオがあります。

これは、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);
            }
        }
    }
}

敬具、

ウィリアム・バータン

4

4 に答える 4

3

いくつかのこと:

1) その AsyncTask は非常にバグが多いです。まず、常にトリガーされます-その静的変数は、あなたがいるときは決して真ではありません-getViewメインスレッドは両方同時に存在することはできません! さらに重要なことは、メインスレッドを変更していることです。これは、BAD、BAD、BAD です。独自のコードとフレームワークの両方に対して、競合状態に悩まされています。ビューに触れるだけにやり直す必要がありますnotifyDataSetChangedgetViewViewsonPostExecute

2)あなたのコードはnotifyDataSetChanged()本当に不安定なようです-ビューへの参照を保持していますが、onClickリスナーが実行される前にクリックしてスクロールすると、ビューが画面に表示されなくなる可能性があります。これはまれなケースですが、一般的に、ListView アイテムまたはサブビューへの参照を保持することは絶対に避けてください。これにより、問題やメモリ リークが発生することは間違いありません (特に、参照が静的であるこの場合は!)。

バグの正確な原因はわかりませんが、推測するなら、それはviewAux.setPressed/setSelected/requestFocus行だと思います。具体的には、requestFocus非常に疑わしい - Android は、ウィンドウ内のスクロール コンテナーをスクロールして、フォーカスされたビューを表示領域に配置します。

3) ListView から削除android:scrollXscrollYます - 実際には何もしないと確信していますが、たとえ実行したとしても、それはおそらく間違ったことです。

于 2013-07-25T13:42:54.350 に答える
2

@Delyanは正しいです。ということになると、破ってはならないすべての「法律」を破っていることを付け加えておきますListView。(メソッドから) 再利用されたビューへの参照を保持するgetViewことはすべきではありません。静的に保持することはさらに悪いことです!

クラスのほとんどを書いた Google エンジニアは、ListViewまさにそれを行ったときに発生する可能性のある奇妙なことについて話しました: http://www.youtube.com/watch?v=wDBM6wVEO70 (プレゼンテーション全体を見る必要がありますが、時間 44 にジャンプします: 20)

于 2013-07-29T15:39:20.043 に答える
0

この動作は、Android 5.1 の既知のバグが原因である可能性もあります。こちらのバグレポートを参照してください

任意の ListView でこれを再現できましたが、スクロール ビューは正常に動作しているようです。

于 2015-04-26T10:02:39.267 に答える
0

Varsha Bhatiaが提案したように、次の属性を追加したところ、うまくListView機能しています。

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

それは他の誰かに役立つかもしれません。

ありがとう :)

于 2015-05-15T11:31:36.660 に答える