2013-07-17 15 views
6

Ho uno strano comportamento in ListView e solo un ListView, ho un sacco di ListViews nella mia app, ma solo in questo sta accadendo.ListView "coming back" quando si scorre

Cercherò di spiegare, quando scendo verso il basso, va bene, le pergamene vanno e si fermano alla fine. Quando faccio scorrere verso l'alto, è come lo splash scroll in alto e ritorna in fondo.

Ho il this video che mostra il problema.

Questo è il mio xml del 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" /> 

e programmaticamente ho impostato solo l'adattatore con il mio CustomAdapter, niente di più.

Ho provato altri ListViews e non ho ottenuto questo comportamento.

Sarò felice se qualcuno mi aiuti su questo.

[EDIT]

Ecco il mio adattatore, è un po 'complesso, mi dispiace, ho cercato di tenere tutto, ma hanno alcune limitazioni in termini di dimensioni dei caratteri:

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

Cordiali saluti,

William Bertan

+0

problema è nella tua CustomAdapter ... – Selvin

+0

Come? Quale pensi che sia il problema? Qualche vista? Qualche componente? –

+1

L'unica "SetSelection" è per lo Spinner. –

risposta

3

Coppia di cose:

1) AsyncTask è super buggato. Innanzitutto, è sempre attivato: la variabile statica non è mai vera quando sei in getView - il thread principale non può essere sia in notifyDataSetChanged e getView allo stesso tempo! Ancora più importante, stai modificando Views dal thread principale e questo è BAD, BAD, BAD. È pieno di condizioni di gara, sia contro il tuo codice che contro il framework. Deve essere ripristinato per toccare solo le viste in onPostExecute

2) Il codice in notifyDataSetChanged() sembra davvero instabile: si sta tenendo un riferimento a una vista ma se si fa clic e si scorre prima che il listener onClick venga eseguito tale vista potrebbe non essere più sullo schermo. Si tratta di un caso raro, concesso, ma in generale evitare a tutti i costi l'esecuzione di riferimenti di partecipazione a uno degli articoli o delle visualizzazioni secondarie di ListView. Questo è destinato a causare problemi e/o perdite di memoria (specialmente in questo caso in cui il riferimento è statico!).

Non sono sicuro di quale sia la causa esatta del bug ma, se dovessi indovinare, direi che sono le linee viewAux.setPressed/setSelected/requestFocus. Nello specifico, lo requestFocus è estremamente sospetto: Android scorre qualsiasi contenitore a scorrimento nella finestra per posizionare la Vista focalizzata nell'area visibile.

3) Rimuovere android:scrollX e scrollY dal ListView - Sono abbastanza sicuro che in realtà non fanno nulla ma anche se lo fanno, probabilmente è la cosa sbagliata.

+0

Grazie, ricostruirò quella schermata. –

+0

Puoi dirmi cosa fare per il tuo primo punto. –

2

@Delyan ha ragione. Aggiungo che stai violando tutte le "leggi" che non dovrebbero essere infranti quando si tratta di ListView. Tenere un riferimento a una vista riciclata (dal metodo getView) è qualcosa che non si dovrebbe fare, e tenerlo statico è anche peggio!

L'ingegnere di Google che ha scritto la maggior parte della classe ListView parlando di cose strane che possono accadere quando si fa esattamente questo: http://www.youtube.com/watch?v=wDBM6wVEO70 (si dovrebbe vedere l'intera presentazione, ma saltare a tempo di 44:20)

0

Questo comportamento può anche essere causato da un bug noto in Android 5.1. See the bug report here.

Sono stato in grado di riprodurlo su qualsiasi ListView, ma le visualizzazioni di scorrimento sembrano comportarsi normalmente.

0

come suggerito da Varsha Bhatia Ho appena aggiunto seguenti attributi nel mio ListView e che sta funzionando per me:

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

Può utile a qualcun altro.

Grazie :)

Problemi correlati