ListView "returns" when scrolling

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()); //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); } } } } 

Yours faithfully,

William Bertan

+6
source share
4 answers

A couple of things:

1) That AsyncTask is super buggy. Firstly, it always fires - this static variable is never true if you are in getView - the main thread cannot be in notifyDataSetChanged and getView at the same time! More importantly, you are changing Views from the main thread, and these are BAD, BAD, BAD. It is permeated by the conditions of the race, both against your own code, and against the frame. It needs to be redone to apply only to “Views” in onPostExecute

2) Your code in notifyDataSetChanged() seems really flaky - you keep a link to the View, but if I click and scroll before your onClick listener is executed, the View will no longer be displayed on the screen. This is a rare case provided, but in any case, by all means avoid using links to links to any ListView or subviews. This is due to problems and / or memory leaks (especially in this case, when the link is static!).

I'm not sure exactly what the cause of the error is, but if I were to guess, I would say that these are the lines viewAux.setPressed/setSelected/requestFocus . In particular, requestFocus is super suspicious - Android scrolls any scrollable containers in the window to put the focused view in the visible area.

3) Remove android:scrollX and scrollY from the ListView - I'm sure that they actually don't do anything, but even if they do, it may be wrong.

+3
source

@ Delyan is right. I will add that you are breaking all the "laws" that should not be interrupted when it comes to ListView . Keeping a reference to the redesigned view (using the getView method) is something you shouldn't do, and keeping it static is even worse!

A Google engineer who wrote most of the ListView class talking about strange things that might happen when doing just that: http://www.youtube.com/watch?v=wDBM6wVEO70 (you should see the whole presentation, but go to time 44 :20)

+2
source

This behavior can also be caused by a known bug in Android 5.1. See bug report here .

I was able to reproduce this in any ListView, but scroll views seem to behave normally.

0
source

As suggested by Varsha Bhatia I just added the following attributes to my ListView and it works for me:

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

It might help someone else.

Thanks:)

0
source

Source: https://habr.com/ru/post/949646/


All Articles