2012-03-20 1 views
32

У меня есть ListView с fastScrollAlwaysVisible и fastScrollEnabled оба установлены в true. После внедрения SectionIndexer в мои Adapter и AlphabetIndexer мой fast scroll thumb исчезнет, ​​пока я прокручу, а затем снова появится, как только я доберусь до верхней или нижней части списка. Я довольно не знаю, почему это происходит. Раньше я этого не испытывал.Быстрая прокрутка большого пальца исчезает при прокрутке AlphabetIndexer

Все нижеследующее работает до AlphabetIndexer. Мой вопрос: почему мой быстрый палец прокрутки исчезает во время прокрутки и как я могу остановить его от исчезновения?

Независимо от того, является ли fast scrollвсегда видимым не имеет значения. Всякий раз, когда видна fast scroll, fast scroll thumb не существует, это просто исчезло, и это моя проблема. Кроме того, когда я удаляю AlphabetIndexer, работает fast scroll thumb, как я его намерен. Все работает успешно в Activity, но когда я загружаю ListView в Fragment, все заканчивается, как я объясняю.

Это мой Adapter для моего ListView:

private class AlbumsAdapter extends SimpleCursorAdapter implements 
     SectionIndexer { 

private AlphabetIndexer mIndexer; 

// I have to override this because I'm using a `LoaderManager` 
@Override 
    public Cursor swapCursor(Cursor cursor) { 

     if (cursor != null) { 
      mIndexer = new MusicAlphabetIndexer(cursor, mAlbumIdx, 
        getResources().getString(R.string.fast_scroll_alphabet)); 
     } 
     return super.swapCursor(cursor); 
    } 

    @Override 
    public Object[] getSections() { 
     return mIndexer.getSections(); 
    } 

    @Override 
    public int getPositionForSection(int section) { 
     return mIndexer.getPositionForSection(section); 
    } 

    @Override 
    public int getSectionForPosition(int position) { 
     return 0; 
    } 
} 

MusicAlphabetIndexer помогает разобраться в музыке правильно:

class MusicAlphabetIndexer extends AlphabetIndexer { 

public MusicAlphabetIndexer(Cursor cursor, int sortedColumnIndex, 
     CharSequence alphabet) { 
    super(cursor, sortedColumnIndex, alphabet); 
} 

@Override 
protected int compare(String word, String letter) { 
    String wordKey = MediaStore.Audio.keyFor(word); 
    String letterKey = MediaStore.Audio.keyFor(letter); 
    if (wordKey.startsWith(letter)) { 
     return 0; 
    } else { 
     return wordKey.compareTo(letterKey); 
    } 
    } 
} 
+0

Я делаю что-то похож ЗДЕСЬ http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

+0

я взял на вашем посту и не видел ничего плохого. Мой 'SectionIndexer' работает и не отображается при прокрутке, и кажется, что у вас есть противоположная проблема, странная. Я начинаю думать, что «Фрагменты» являются виновниками, но я не уверен, как сейчас. Я думаю, что это потому, что мой 'SectionIndexer' работает в' ListActivity'. – adneal

+0

Я попытаюсь посмотреть, смогу ли я воссоздать ваши проблемы. –

ответ

2

У вас есть как fastScrollEnabled и fastScrollAlwaysVisible набор для true? Не существует атрибута fastScrollAlwaysEnabledListView, поэтому я думаю, возможно, у вас только fastScrollEnabled установлено значение true, но fastScrollAlwaysVisible установлено на значение по умолчанию, которое равно false.

+0

О, ничего себе. На самом деле это опечатка. Я имел в виду 'fastScrollAlwaysVisible'. У меня также установлено 'fastScrollEnabled' значение true. Я фактически обновил свой OP немного больше. Спасибо за комментарий, я бы никогда не заметил, что сделал опечатку. – adneal

-2

активность

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.AlphabetIndexer; 
import android.widget.ListView; 
import android.widget.SectionIndexer; 
import android.widget.SimpleCursorAdapter; 

public class TestAct extends Activity { 
    /** Called when the activity is first created. */ 
    ListView test_listView; 
    Cursor myCursor; 
    String[] proj; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_app_test); 

     TestDummyData cTestDummyData = new TestDummyData(
       getApplicationContext()); 
     cTestDummyData.open(); 
     cTestDummyData.insertRandomNames(); 
     myCursor = cTestDummyData.fetchAllData(); 

     test_listView = (ListView) findViewById(R.id.pager_list_test); 
     test_listView.setFastScrollEnabled(true); 

     test_listView.setAdapter(

     new MyCursorAdapter(getApplicationContext(), 
       android.R.layout.simple_list_item_1, myCursor, 
       new String[] { TestDummyData.KEY_NAME },// names 
       new int[] { android.R.id.text1 }) 

     ); 

     cTestDummyData.close(); 

    } 

    class MyCursorAdapter extends SimpleCursorAdapter implements SectionIndexer { 

     AlphabetIndexer alphaIndexer; 

     // HashMap<String, Integer> alphaIndexer; 
     // String[] sections; 
     public MyCursorAdapter(Context context, int layout, Cursor c, 
       String[] from, int[] to) { 
      super(context, layout, c, from, to); 

      alphaIndexer = new AlphabetIndexer(c, 
        myCursor.getColumnIndex(TestDummyData.KEY_NAME), 
        " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
      // ======optional way to get alphaindexer from data 
      // alphaIndexer = new HashMap<String, Integer>(); 
      // int size = items.size(); 
      // 
      // for (int x = 0; x < size; x++) { 
      // String s = items.get(x); 
      // 
      // String ch = s.substring(0, 1); 
      // 
      // ch = ch.toUpperCase(); 
      // 
      // alphaIndexer.put(ch, x); 
      // } 
      // 
      // Set<String> sectionLetters = alphaIndexer.keySet(); 
      // 
      // ArrayList<String> sectionList = new ArrayList<String>(
      // sectionLetters); 
      // 
      // Collections.sort(sectionList); 
      // 
      // sections = new String[sectionList.size()]; 
      // 
      // sectionList.toArray(sections); 

     } 

     @Override 
     public int getPositionForSection(int section) { 
      // TODO Auto-generated method stub 
      return alphaIndexer.getPositionForSection(section); 
     } 

     @Override 
     public int getSectionForPosition(int position) { 
      // TODO Auto-generated method stub 
      return alphaIndexer.getSectionForPosition(position); 
     } 

     @Override 
     public Object[] getSections() { 
      // TODO Auto-generated method stub 
      return alphaIndexer.getSections(); 
     } 

    } 

} 

Класс Чтобы использовать фиктивные данные для перечисления

import java.util.Random; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class TestDummyData { 

    static final String KEY_ID = "_id"; 
    static final String KEY_NAME = "name"; 

    private static final String DB_NAME = "tutorial"; 
    private static final String TABLE_NAME = "names"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String DATABASE_CREATE = "create table " + TABLE_NAME 
      + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME 
      + " varchar not null);"; 

    private Context context; 
    private DatabaseHelper dbHelper; 
    private SQLiteDatabase db; 

    public TestDummyData(Context context) { 
     this.context = context; 
     this.dbHelper = new DatabaseHelper(this.context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DB_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(DATABASE_CREATE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.v("DBUTIL", "Upgrading database from version " + oldVersion 
        + " to " + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
      onCreate(db); 
     } 
    } 

    public void open() { 
     db = dbHelper.getWritableDatabase(); 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

    public void insertRandomNames() { 
     db.execSQL("DELETE FROM " + TABLE_NAME); 
     String s = "ANDROIDDEVELOPER"; 
     Random r = new Random(); 

     ContentValues values = new ContentValues(); 
     for (int i = 0; i < 200; i++) { 
      values.clear(); 
      values.put(KEY_NAME, s.substring(r.nextInt(s.length()))); 
      db.insert(TABLE_NAME, null, values); 
     } 
    } 

    public Cursor fetchAllData() { 
     return db.rawQuery("SELECT * FROM " + TABLE_NAME + " ORDER BY " 
       + KEY_NAME + " ASC", null); 
    } 

} 

выше класс фиктивных CLSS данных для общей задачи ... list_app_test.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

<ListView 
android:id="@+id/pager_list_test" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
</ListView> 

</LinearLayout> 

вы только что дали test_listView.setFastScrollEnabled (true); gvn ans whter i cn понять из урского квеста.

+3

Это не полезно. Я знаю, как реализовать 'SectionIndexer'. То, что я не знаю, так это то, что при прокрутке указатель быстрого прокрутки исчезает. – adneal

+1

Возможно, это наименее полезный ответ, который я когда-либо встречал. –

7

У меня была аналогичная проблема с пиктограммой быстрого скроллера. Я изучал исходный код Android и нашел коммит, который представил эту проблему и другие (ArrayIndexOutOfBoundsException). Я построил даже систему Android без этой фиксации, и тогда она работала.

Я представил этот вопрос в июне: https://code.google.com/p/android/issues/detail?id=33293
Когда я читаю это знаю, я вижу, я мог бы описать проблему лучше :)

Это обязательство, которое делает проблемы: https://github.com/android/platform_frameworks_base/commit/32c3a6929af9d63de3bf45a61be6e1a4bde136d3

К сожалению Я не нашел никакого решения, кроме того, что вернул commit, и я его оставил.
Надеюсь, кто-то найдет, как это исправить.

+0

Да, я подозревал, что это ошибка структуры. Я также видел, что другие приложения в Play Store имеют одно и то же. Я рад, что вы разместили это. – adneal

0

Вы можете проверить этот код:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
if (currentapiVersion <= android.os.Build.VERSION_CODES.FROYO){ 
    // Do something for froyo and above versions 
    list.setFastScrollEnabled(true); 


} else if(currentapiVersion > android.os.Build.VERSION_CODES.HONEYCOMB){ 
    // do something for phones running an SDK before froyo 
    list.setFastScrollEnabled(true); 
    list.setFastScrollAlwaysVisible(true); 
} 
+0

Вау, [это] (https://stackoverflow.com/a/30370154/1677912) [код] (http://stackoverflow.com/a/29958384/1677912) [получает] (http://stackoverflow.com/a/34332188/1677912) [вокруг] (http://stackoverflow.com/a/3940823/1677912)! Предложите указать атрибут для кода, который вы нашли. (Базовая структура from docs, правильно?) – Mogsdad

+0

[setFastScrollAlwaysVisible] (http://developer.android.com/intl/es/reference/android/widget/AbsListView.html#setFastScrollAlwaysVisible (boolean)) -> Устанавливает, должен ли быстрый скроллер всегда отображаются вместо стандартных полос прокрутки. – Cabezas

Смежные вопросы