2012-06-11 2 views
16

Ich verwende einen Adapter für ListView, der SectionIndexer implementiert. ListView hat fastScrollEnabled auf True in XML-Datei festgelegt. Alles funktioniert super auf Android 2.2 und 2.3, aber wenn ich meine Anwendung auf einem Tablet mit Android 3.0 teste, verschwindet in einigen Bereichen die Bildlaufleiste. Wenn ich zum Beispiel in der Liste nach unten scrolle, ist bei Elementen, die mit den Buchstaben A-B beginnen, die Bildlaufleiste sichtbar, aber bei den Buchstaben C-H ist das nicht der Fall, und dann ist H wieder sichtbar.Die Bildlaufleiste verschwindet bei der Verwendung von SectionIndexer an bestimmten Stellen auf Honeycomb

Dieser Adapter wurde entwickelt, um Inhalte in ListView alphabetisch zu sortieren, so dass fastscroll verwendet werden kann.

Anwendung ist für API Level 8 ausgelegt, so konnte ich fastScrollAlwaysVisible nicht verwenden.

ist hier ein Code meines Adapters:

public class AlphabetSimpleAdapter extends SimpleAdapter implements SectionIndexer { 

    private HashMap<String, Integer> charList; 
    private String[] alphabet; 
    public Typeface tfSansMedium; 
    public Context mContext; 
    public int mResource; 
    public int[] mTo; 
    public List<? extends Map<String, ?>> mData; 
    public String mTitleKey; 

    public AlphabetSimpleAdapter(Context context, 
      List<? extends Map<String, ?>> data, int resource, String[] from, 
      int[] to, String titleKey /* key sent in hashmap */) { 
     super(context, data, resource, from, to); 
     mData = data; 
     mTitleKey = titleKey; 
     mContext = context; 
     mResource = resource; 
     mTo = new int[to.length]; 
     for (int i = 0; i < to.length; i ++) 
     { 
      mTo[i] = to[i]; 
     } 
     charList = new HashMap<String, Integer>(); 
     int size = data.size(); 
     tfSansMedium = Typeface.createFromAsset(context.getAssets(), "fonts/VitesseSans-Medium.otf"); 
     for(int i = 0; i < size; i++) { 
         // Parsing first letter of hashmap element 
      String ch = data.get(i).get(titleKey).toString().substring(0, 1); 
      ch = ch.toUpperCase(); 

      if(!charList.containsKey(ch)) { 
       charList.put(ch, i); // Using hashmap to avoid duplicates 
      } 
     } 

     Set<String> sectionLetters = charList.keySet(); // A set of all first letters 

     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); // Creating arraylist to be able to sort elements 
     Collections.sort(sectionList, Collator.getInstance(new Locale("pl", "PL"))); // Sorting elements 
     alphabet = new String[sectionList.size()]; 
     sectionList.toArray(alphabet); 

    } 

    // Methods required by SectionIndexer 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = li.inflate(mResource, null); 
     } 
     for (int i = 0; i < mTo.length; i ++) { 
      TextView tv = (TextView)v.findViewById(mTo[i]); 
      if (tv != null) tv.setTypeface(tfSansMedium); 
     } 
     return super.getView(position, v, parent); 
    } 

    @Override 
    public int getPositionForSection(int section) { 
     if(!(section > alphabet.length-1)) { 
      return charList.get(alphabet[section]); 
     } 
     else { 
      return charList.get(alphabet[alphabet.length-1]); 
     } 
    } 

    @Override 
    public int getSectionForPosition(int position) { 
     return charList.get(mData.get(position).get(mTitleKey).toString().substring(0, 1)); 
    } 

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

ist eine HashMap, wo ich Briefe mit ihrem letzten erscheinenden Index speichern, so, wenn ich 6 Elemente mit dem Buchstaben „A“ beginnen, wird der Wert für die Taste " A "ist 5 und so weiter.

alphabet ist ein String-Array mit allen vorhandenen Anfangsbuchstaben.

+0

Haben Sie das herausgefunden? Ich arbeite an demselben Problem. Es war mein Problem mit der getSectionForPosition-Methode. – KickingLettuce

+0

Leider nicht. Habe viele Stunden damit verbracht es herauszufinden, musste es aber letztendlich so lassen wie es war. –

+0

Dieses Problem wurde bereits hier erwähnt: http://StackOverflow.com/a/13470842/1140682 – saschoar

Antwort

2

Ich hatte das gleiche Problem. Ich gab meine minimale SDK-Version als 8 und traget als 16 und schrieb den folgenden Code. Und alles hat gut funktioniert.

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


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

Es funktioniert, danke !!! – Cabezas

Verwandte Themen