2013-07-17 28 views
6

ListViewで奇妙な動作が発生し、ListViewが1つしかない場合、私のアプリケーションにListViewがたくさんありますが、これが起こっています。スクロール時にListViewが "戻る"

私は下にスクロールすると、スクロールが終了し、最後に停止することを説明しようとします。私が上にスクロールすると、上のスクロールスプラッシュのようになり、下に戻ります。

私はthis videoに問題があります。

これは、リストビューの私の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、より多くの何もアダプタを設定します。

私は他のListViewでテストしましたが、私はこの動作を得ていませんでした。

誰かが私を助けてくれたらうれしいです。

[EDIT]

ここで、それは少し複雑な私のアダプタだが、申し訳ありませんが、私はすべてを保つが、文字のサイズはいくつかの制限があります試してみました:

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

種類よろしくウィリアム・ベルタン

+0

問題はあなたのカスタムアダプターにあります... – Selvin

+0

どのようにですか?あなたは何が問題だと思いますか?いくつかのビュー?一部のコンポーネントですか? –

+1

Spinner用の唯一の "SetSelection"です。 –

答えて

3

いくつかのもの:

1 )そのAsyncTaskは超バグです。まず、常に起動されます。つまり、getViewに入っているときには静的変数は決してtrueになりません。メインスレッドはnotifyDataSetChangedgetViewの両方に同時に存在することはできません。さらに重要なことは、Viewsをメインスレッドから外していることです。これはBAD、BAD、BADです。これは、自分のコードとフレームワークとの両方に対して、競合状態で詰まっています。あなたのコードはonPostExecute

2)あなたのコードは本当に薄れているようです - あなたはViewへの参照を保持していますが、クリックしてスクロールするとonClickリスナーが実行される前にスクロールすることができます。もはや画面には表示されません。これはまれなケースですが、一般的には、ListViewの項目またはサブビューのいずれかへの参照を保持していることを避けてください。それはトラブルやメモリリークを引き起こす可能性があります(この場合、特に参照が静的な場合)。

私はバグの正確な原因は何か分かりませんが、推測しなければならないとすれば、それはviewAux.setPressed/setSelected/requestFocus行だと思います。具体的には、requestFocusは超疑いです。Androidは、ウィンドウ内のスクロールするコンテナをスクロールして、フォーカスされたViewを可視領域に配置します。

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

+0

ありがとうございます、私はその画面を再構築します。 –

+0

あなたの最初の点について何をすべきか教えてくれますか? –

2

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

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

0

この動作Android 5.1の既知のバグによっても引き起こされる可能性があります。 See the bug report here

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

0

Varsha Bhatiaによって示唆されるように、私はちょうど私のListViewに次の属性を追加しましたし、それは私のために働いています:

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

それは他の誰かに役立つことがあります。

ありがとうございました:)

関連する問題