Pregunta El pulgar de desplazamiento rápido desaparece al desplazarse por AlphabetIndexer


tengo un ListView con fastScrollAlwaysVisible y fastScrollEnabled ambos configurados para true. Después de implementar SectionIndexer para mi Adapter y un AlphabetIndexer, mi fast scroll thumb desaparecerá mientras me desplazo, luego reapareceré una vez que llegue a la parte superior o inferior de la lista. No tengo ni idea de por qué sucede esto. No lo he experimentado antes.

Todo lo que sigue funciona tan lejos como AlphabetIndexer está preocupado. Mi pregunta es: ¿por qué mi pulgar de desplazamiento rápido desaparece mientras me desplazo y cómo puedo evitar que desaparezca?

Si el fast scroll es siempre visible no importa. Siempre que el fast scroll es visible, el fast scroll thumb no está allí, simplemente se fue y ese es mi problema. Además, cuando elimino el AlphabetIndexer el fast scroll thumb funciona como pretendo que lo haga. Todo funciona con éxito en un Activity, pero cuando cargo mi ListView en un Fragment las cosas terminan como explico.

Este es mi Adapter para mi 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 ayuda a ordenar la música correctamente:

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

32
2018-03-20 02:56


origen


Respuestas:


Tuve un problema similar con el ícono de pulgar del desplazador rápido. Estaba investigando el código fuente de Android y encontré un compromiso que introdujo este problema y otro (ArrayIndexOutOfBoundsException). Construí incluso el sistema Android sin este compromiso y funcionó entonces.

Presenté el problema en junio: https://code.google.com/p/android/issues/detail?id=33293
Cuando estoy leyendo, sé que veo que podría describir el problema mejor :)

Este es el compromiso que está causando problemas: https://github.com/android/platform_frameworks_base/commit/32c3a6929af9d63de3bf45a61be6e1a4bde136d3

Lamentablemente, no encontré ninguna solución, excepto revertir el compromiso, y lo dejé.
Espero que alguien encuentre la forma de solucionarlo.


7
2017-11-20 10:08



¿Tienes ambos fastScrollEnabled y fastScrollAlwaysVisible ajustado a true? No hay fastScrollAlwaysEnabled atributo de un ListView, entonces estoy pensando que tal vez solo tienes fastScrollEnabled establecido en verdadero, pero fastScrollAlwaysVisible se establece en su valor predeterminado, que es false.


2
2018-03-24 12:53



Puedes consultar este código:

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
2018-05-04 17:14



Actividad

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

    }

}

Clase Para usar datos ficticios para el listado

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

}

la clase anterior es clics de datos ficticios para tareas comunes ... 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>

usted acaba de dar test_listView.setFastScrollEnabled (true); gvn ans whter entiendo de su búsqueda.


-2
2018-04-18 07:09