studio recyclerview item example ejemplo custom android android-listview android-4.4-kitkat

recyclerview - Problemas con el desplazamiento rápido en Android 4.4



recycle listview android (3)

Aquí hay una alternativa ligeramente mejorada que es similar a la respuesta de mikejonesguy

Básicamente, se establece el desplazamiento rápido siempre visible cuando el desplazamiento de la lista no está inactivo. Cuando la lista deja de desplazarse, inicia un temporizador y desactiva el desplazamiento rápido después de un período de tiempo. Esto duplica la forma en que solía funcionar en versiones anteriores de Android.

Espero eso ayude

//fix for kitkat bug in fast scroll Runnable delayedFastScrollFixRunnable = new Runnable() { @Override public void run() { if (listView != null && fastScrollAlwaysVisible) { listView.setFastScrollAlwaysVisible(false); fastScrollAlwaysVisible = false; } } }; Handler delayedFastScrollFixHandler = new Handler(); boolean fastScrollAlwaysVisible = false; mList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //fix an issue with 4.4 not showing fast scroll if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (scrollState == SCROLL_STATE_IDLE) { if (fastScrollAlwaysVisible) { delayedFastScrollFixHandler.postDelayed(delayedFastScrollFixRunnable, 750); } } else { if (!fastScrollAlwaysVisible) { delayedFastScrollFixHandler.removeCallbacks(delayedFastScrollFixRunnable); listView.setFastScrollAlwaysVisible(true); fastScrollAlwaysVisible = true; } } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });

Escribí una aplicación que contiene un ListView en su diseño que admite desplazamiento rápido (es decir, arrastrar el control deslizante de la barra de desplazamiento le permite desplazarse rápidamente hacia arriba o hacia abajo en la lista). Esto funcionó perfectamente en todas las versiones de Jelly Bean (4.1-4.3). Sin embargo, después de actualizar a Kit Kat, el desplazamiento rápido ya no funciona, y mi barra de desplazamiento es solo una barra de desplazamiento normal. Sin embargo, si salgo de mi aplicación y vuelvo a entrar, aparece un desplazamiento rápido. ¿Cómo obtengo el desplazamiento rápido para trabajar constantemente en Kit Kat? He copiado y pegado el código del adaptador de vista de lista a continuación:

// Adds section popup for fast scroll class NameListAdapter extends SimpleAdapter implements SectionIndexer { HashMap<String, Integer> alphaIndexer; private String[] sections; private ArrayList<String> sectionList; private List<HashMap<String, String>> data = null; public NameListAdapter (Context context, List<HashMap<String, String>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); alphaIndexer = new HashMap<String, Integer>(); sectionList = new ArrayList<String>(); this.data = data; int size = data.size(); for (int i = 0; i < size; i++) { HashMap<String, String> myData = (HashMap <String, String>) data.get(i); // Get first character String ch = myData.get("name").substring(0, 1); // Convert character to upper case ch = ch.toUpperCase(); // Put first char/index into our HashMap if (!alphaIndexer.containsKey(ch)) { alphaIndexer.put(ch, i); sectionList.add(ch); } } sections = new String[sectionList.size()]; sectionList.toArray(sections); } @Override public int getPositionForSection(int section) { if (section >= sections.length) { return getCount() - 1; } return alphaIndexer.get(sections[section]); } @Override public int getSectionForPosition(int pos) { if (pos > data.size()) { return 0; } HashMap<String, String> myData = (HashMap <String, String>) data.get(pos); String ch = myData.get("name").substring(0, 1); // Convert character to upper case ch = ch.toUpperCase(); for (int i = 0; i < sectionList.size(); i++) { if (sectionList.get(i).equals(ch)) { return i; } } return 0; } @Override public Object[] getSections() { return sections; } }


Es un problema conocido (reportado code.google.com/p/android/issues/detail?id=63545 y here ), y se solucionó en 4.4.3.

Aquí hay una solución:

public static void setFastScrolledEnabled(final AdapterView<?> adapterView,final boolean enable) { final GridView gridView; final ListView listView; if(adapterView instanceof GridView) { gridView=(GridView)adapterView; listView=null; } else if(adapterView instanceof ListView) { listView=(ListView)adapterView; gridView=null; } else throw new UnsupportedOperationException("setFastScrolledEnabled is only available for gridView/listView"); if(Build.VERSION.SDK_INT==VERSION_CODES.KITKAT) adapterView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onGlobalLayout() { if(gridView!=null) gridView.setFastScrollEnabled(enable); else if(listView!=null) listView.setFastScrollEnabled(enable); adapterView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); else if(gridView!=null) gridView.setFastScrollEnabled(enable); else if(listView!=null) listView.setFastScrollEnabled(enable); }


Tener el mismo problema aquí, no es una buena solución, pero por ahora puedes hacer:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { view.setFastScrollAlwaysVisible(true); }

Esto mantendrá su desplazamiento rápido en todo el tiempo.