2013-07-17 35 views
6

Tôi đang nhận được một hành vi lạ trong ListView, và chỉ có một ListView, tôi có rất nhiều ListView trong ứng dụng của tôi, nhưng chỉ trong điều này đang xảy ra.ListView "quay lại" khi cuộn

Tôi sẽ cố gắng giải thích, khi tôi cuộn xuống dưới cùng, được rồi, cuộn đi và dừng ở cuối. Khi tôi cuộn lên trên cùng, nó giống như giật gân cuộn ở trên cùng và quay trở lại phía dưới.

Tôi có this video hiển thị sự cố.

Đây là xml của tôi về 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" /> 

Và lập trình tôi chỉ đặt Adapter với CustomAdapter của tôi, không có gì hơn.

Tôi đã thử nghiệm ở những người khác ListViews và tôi không nhận được hành vi này.

Tôi sẽ rất vui nếu có ai đó giúp tôi về vấn đề này.

[EDIT]

Đây là Adaptor của tôi, đó là một chút phức tạp, xin lỗi, tôi đã cố gắng giữ mọi thứ nhưng có một số giới hạn về kích thước của ký tự:

[PACKAGE] 

[IMPORTS] 

public class CustomAdapter_Produto_Insercao extends ArrayAdapter<Produto_Insercao> { 

    static View view_aux = null; 

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

    static Activity ctx; 

    static Dialog_TW ad_estoque; 

    static List<Condicao_Preco> list_tabela_preco_condicao; 

    public static boolean clickable = true; 

    public static boolean highlight = false; 

    public static int linha_atual = 0; 

    public static View view_atual = null; 

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

    static String caminho_foto; 

    static DecimalFormat decimalFormat = null; 

    static Repositorio repositorio; 

    static Condicao_Preco c_p_null; 

    static boolean inNotify = false; 

    private final LayoutInflater inflater; 

    private final int resourceId; 

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

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

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

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

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

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

     super(context, resource, objects); 

     ctx = context; 

     this.list_tabela_preco_condicao = list_tabela_preco_condicao; 

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

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

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

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

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

     caminho_foto = repositorio.Parametro_getValue("caminho_foto"); 

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

    private static class ViewHolder { 
     public int  position; 

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

     public Button    mais_opcoes; 
    } 

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

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

     super.notifyDataSetChanged(); 

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

     inNotify = false; 
    } 

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

     final Produto_Insercao p = getItem(position); 

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

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

      viewHolder = new ViewHolder(); 

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

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

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

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

     Repeater qt_produto_menos_repeater = new Repeater(viewHolder.qt_produto_menos); 

     viewHolder.qt_produto_menos.setOnLongClickListener(qt_produto_menos_repeater); 

     Repeater qt_produto_mais_repeater = new Repeater(viewHolder.qt_produto_mais); 

     viewHolder.qt_produto_mais.setOnLongClickListener(qt_produto_mais_repeater); 

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

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

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

      p.setId_liberado(false); 
     } 

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

       notifyDataSetChanged(); 
      } 
     }); 

     viewHolder.position = position; 

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

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

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

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

     return convertView; 
    } 

    private static class MyAsyncTask extends AsyncTask { 

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

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

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

      lista_tabela_preco_condicao = new ArrayList<Condicao_Preco>(); 
     } 

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

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

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

         Double qt_anterior = viewHolder.qt_produto.getValor_Double(); 

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

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

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

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

         calculaInformacoes(false); 

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

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

         Double qt_anterior = viewHolder.qt_produto.getValor_Double(); 

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

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

         calculaInformacoes(false); 

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

       lista_tabela_preco_condicao.add(c_p_null); 

       lista_tabela_preco_condicao.addAll(list_tabela_preco_condicao); 

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

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

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

       viewHolder.spn_tabela_condicao_preco.setOnItemSelectedListener(onItemSelectedListener); 

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

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

        linha_atual = position; 
        view_atual = convertView; 

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

        p.setId_liberado(true); 

        mAdapter.notifyDataSetChanged(); 
       } 
      }); 

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

        ad_estoque = new Dialog_TW(ctx); 

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

        View view_estoque = ad_estoque.getView(); 

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

        ds_produto.setText(p.toString()); 

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

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

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

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

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

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

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

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

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

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

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

       viewHolder.spn_tabela_condicao_preco.setAdapter(adapter); 

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

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

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

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

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

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

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

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

Kind Regards,

William Bertan

+0

vấn đề là ở CustomAdapter của bạn ... – Selvin

+0

như thế nào? Những gì bạn nghĩ là vấn đề? Một số chế độ xem? Một số thành phần? –

+1

Chỉ có "SetSelection" cho Spinner. –

Trả lời

3

Vài điều:

1) AsyncTask đó là siêu lỗi. Đầu tiên, nó luôn được kích hoạt - biến tĩnh đó không bao giờ đúng khi bạn đang ở trong getView - chủ đề chính không thể là cả hai trong notifyDataSetChangedgetView cùng một lúc! Quan trọng hơn, bạn đang thay đổi Views khỏi chuỗi chính và đó là BAD, BAD, BAD. Đó là điều kiện riddled với chủng tộc, cả hai chống lại mã của riêng bạn và chống lại khuôn khổ. Nó phải được làm lại để chỉ chạm vào các Chế độ xem trong onPostExecute

2) Mã của bạn trong notifyDataSetChanged() có vẻ thực sự không ổn định - bạn đang giữ tham chiếu đến Chế độ xem nhưng nếu tôi nhấp và cuộn trước khi người nghe onClick của bạn được thực hiện có thể Xem không còn trên màn hình nữa. Đó là một trường hợp hiếm hoi, được cấp, nhưng nói chung tránh tất cả các chi phí chạy tham chiếu giữ cho bất kỳ mục ListView hoặc subviews nào. Đó là ràng buộc gây rắc rối và/hoặc rò rỉ bộ nhớ (đặc biệt là trong trường hợp này, nơi tham chiếu là tĩnh!).

Tôi không chắc nguyên nhân chính xác của lỗi là gì, nhưng nếu tôi phải đoán, tôi muốn nói đó là số viewAux.setPressed/setSelected/requestFocus dòng. Cụ thể, requestFocus siêu đáng ngờ - Android cuộn bất kỳ vùng chứa cuộn nào trong cửa sổ để đặt Chế độ xem tập trung vào khu vực hiển thị.

3) Xóa android:scrollXscrollY khỏi ListView - Tôi chắc chắn họ không thực sự làm bất cứ điều gì, nhưng ngay cả khi họ làm, có thể đó là điều sai trái.

+0

Cảm ơn bạn, tôi sẽ xây dựng lại màn hình đó. –

+0

Bạn có thể cho tôi biết phải làm gì cho điểm đầu tiên của bạn không. –

2

@Delyan là đúng. Tôi sẽ thêm rằng bạn đang vi phạm tất cả "luật" không nên bị hỏng khi nói đến ListView. Giữ một tham chiếu đến một cái nhìn tái chế (từ phương pháp getView) là một cái gì đó bạn không nên làm, và giữ nó tĩnh thậm chí còn tồi tệ hơn!

Các kỹ sư của Google, người đã viết hầu hết các lớp ListView nói về những điều kỳ lạ có thể xảy ra khi thực hiện chính xác điều đó: http://www.youtube.com/watch?v=wDBM6wVEO70 (bạn sẽ thấy toàn bộ trình bày, nhưng nhảy đến thời gian 44:20)

0

Hành vi này cũng có thể do lỗi đã biết trong Android 5.1. See the bug report here.

Tôi đã có thể tạo lại điều này trên bất kỳ ListView nào, nhưng chế độ xem cuộn dường như hoạt động bình thường.

0

theo đề nghị của Varsha Bhatia Tôi vừa mới thêm vào thuộc tính sau trong ListView tôi và Nó làm việc cho tôi:

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

Nó có thể hữu ích cho người khác.

Cảm ơn :)

Các vấn đề liên quan