I get weird behavior in a ListView, and only one ListView, I have many ListViews in my application, but this only happens.
I will try to explain when I move to the bottom, everything is in order, the scrolls go and stop at the end. When I scroll up, it looks like a splash of scroll at the top and returns to the bottom.
I have this video showing the problem.
This is my xml 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" />
And programmatically, I install the adapter only with my CustomAdapter, nothing more.
I tested in other ListViews and I did not get this behavior.
I would be glad if someone helps me with this.
[EDIT]
Here is my Adapter, it’s a bit complicated, sorry, I tried to save everything, but it has some character size restriction:
[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());
Yours faithfully,
William Bertan