Проблемы с быстрой прокруткой в Android 4.4
Я написал приложение, которое содержит ListView в своем макете, который поддерживает быструю прокрутку (т.е. перетаскивание ползунка полосы прокрутки позволяет быстро прокручивать вверх или вниз по списку). Это отлично работало во всей версии Jelly Bean (4.1-4.3). Однако после того, как я обновился до Kit Kat, быстрый прокрутка больше не работает, и моя полоса прокрутки - это просто обычная полоса прокрутки. Однако, если я отключу свое приложение и вернусь, появится быстрый прокрутка. Как быстро получить прокрутку для постоянной работы в Kit Kat? Я скопировал и вставил код адаптера списка просмотра ниже:
// 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;
}
}
Ответы
Ответ 1
Имея ту же проблему здесь, это не очень хорошее решение, но теперь вы можете сделать:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.setFastScrollAlwaysVisible(true);
}
Это будет держать ваш быстрый скроллер все время.
Ответ 2
Здесь немного улучшена работа, которая похожа на mikejonesguy answer
В основном вы устанавливаете быструю прокрутку, которая всегда отображается, когда прокрутка списка не простаивает.
Когда список перестает прокручиваться, вы запускаете таймер и быстро поворачиваете прокрутку через некоторое время. Это дублирует способ работы с более старыми версиями android.
Надеюсь, что это поможет
//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)
{
}
});
Ответ 3
Это известная проблема (сообщено здесь и здесь), и что он был исправлен с 4.4.3.
Здесь обходной путь:
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);
}