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.
Haben Sie das herausgefunden? Ich arbeite an demselben Problem. Es war mein Problem mit der getSectionForPosition-Methode. – KickingLettuce
Leider nicht. Habe viele Stunden damit verbracht es herauszufinden, musste es aber letztendlich so lassen wie es war. –
Dieses Problem wurde bereits hier erwähnt: http://StackOverflow.com/a/13470842/1140682 – saschoar