Настраиваемый алфавитный отсортированный список с разделами
Я хочу сделать Custom ListView с отсортированными алфавитными приложениями, используя раздел Indexer. Так как секцию Indexer обрабатывают только с ArrayList<String>
Итак, как мне написать собственный адаптер, который имеет функции индексации разделов. Так же, как это:
Пожалуйста, предложите какое-нибудь решение.
Вот мой класс кода MyAZAdapter расширяет ArrayAdapter реализует SectionIndexer { ArrayList myElements; HashMap azIndexer; Строковые [] разделы; Список приложений;
public MyAZAdapter(Context context, int textViewResourceId, List<T> objects, List<ApplicationInfo> apps) {
super(context, textViewResourceId, objects);
myElements = (ArrayList<String>) objects;
azIndexer = new HashMap<String, Integer>(); //stores the positions for the start of each letter
this.apps = apps;
int size = elements.size();
for (int i = size - 1; i >= 0; i--) {
String element = elements.get(i);
//We store the first letter of the word, and its index.
azIndexer.put(element.substring(0, 1), i);
}
Set<String> keys = azIndexer.keySet(); // set of letters
Iterator<String> it = keys.iterator();
ArrayList<String> keyList = new ArrayList<String>();
while (it.hasNext()) {
String key = it.next();
keyList.add(key);
}
Collections.sort(keyList);//sort the keylist
sections = new String[keyList.size()]; // simple conversion to array
keyList.toArray(sections);
}
public int getPositionForSection(int section) {
if (section == 35) {
return 0;
}
for (int i = 0; i < myElements.size(); i++) {
String l = myElements.get(i);
char firstChar = l.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
public int getSectionForPosition(int position) {
Log.v("getSectionForPosition", "called");
return 0;
}
public Object[] getSections() {
return sections; // to string will be called to display the letter
}
}class MyAZAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {
ArrayList<String> myElements;
HashMap<String, Integer> azIndexer;
String[] sections;
List<ApplicationInfo> apps;
public MyAZAdapter(Context context, int textViewResourceId, List<T> objects, List<ApplicationInfo> apps) {
super(context, textViewResourceId, objects);
myElements = (ArrayList<String>) objects;
azIndexer = new HashMap<String, Integer>(); //stores the positions for the start of each letter
this.apps = apps;
int size = elements.size();
for (int i = size - 1; i >= 0; i--) {
String element = elements.get(i);
//We store the first letter of the word, and its index.
azIndexer.put(element.substring(0, 1), i);
}
Set<String> keys = azIndexer.keySet(); // set of letters
Iterator<String> it = keys.iterator();
ArrayList<String> keyList = new ArrayList<String>();
while (it.hasNext()) {
String key = it.next();
keyList.add(key);
}
Collections.sort(keyList);//sort the keylist
sections = new String[keyList.size()]; // simple conversion to array
keyList.toArray(sections);
}
public int getPositionForSection(int section) {
if (section == 35) {
return 0;
}
for (int i = 0; i < myElements.size(); i++) {
String l = myElements.get(i);
char firstChar = l.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
public int getSectionForPosition(int position) {
Log.v("getSectionForPosition", "called");
return 0;
}
public Object[] getSections() {
return sections; // to string will be called to display the letter
}
}
Мой код AppsActivity
elements = new ArrayList<String>();
List<ApplicationInfo> apps = getInstalledApplication(getActivity());
for (int i = 0; i < apps.size(); i++) {
elements.add(apps.get(i).loadLabel(getActivity().getPackageManager()).toString());
}
Collections.sort(elements,String.CASE_INSENSITIVE_ORDER); // Must be sorted!
// listview
myListView = (ListView) rootView.findViewById(R.id.myListView);
//myListView.setFastScrollEnabled(true);
MyAZAdapter<String> adapter = new MyAZAdapter<String>(
getActivity(), android.R.layout.simple_list_item_1,
elements, apps);
myListView.setAdapter(adapter);
SideBar indexBar = (SideBar) rootView.findViewById(R.id.sideBar);
indexBar.setListView(myListView);
1 ответ
adapter.sort(new Comparator<String>() {
public int compare(String object1, String object2) {
return object2.compareTo(object1);
};
});
вам нужен вышеуказанный код прямо перед:
myListView.setAdapter(adapter);