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.