我在这里关注一个很好的编码示例:This SO question。它是关于为数组适配器实现SectionIndexer接口。
但是,如果您的ArrayAdapter传递一个ArrayList< MyObject>不是ArrayList<字符串>?
例如,这是我的代码与他的代码不同的地方。他有:
class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer {
private HashMap<String, Integer> alphaIndexer;
private String[] sections;
public AlphabeticalAdapter(Context c, int resource, List<String> data) {
alphaIndexer = new HashMap<String, Integer>();
for (int i = 0; i < data.size(); i++) {
String s = data.get(i).substring(0, 1).toUpperCase();
alphaIndexer.put(s, i);
}
// other stuff
}
我在调整循环到我的情况时遇到了问题。我不能像他那样测量尺寸。如果他有上述内容,我的适配器开头。
public class CustomAdapter extends ArrayAdapter<Items> implements
SectionIndexer {
public ItemAdapter(Context context, Items[] objects) {
在他传递一个ArrayList的地方,我必须传入三个,但要实现这一点,必须包装一个自定义对象类。我想要排序的ArrayLists之一是名为“name”的类中的三个字段之一。这显然是一个字符串。
我想基于该名称字段使用SectionIndex按字母顺序滚动浏览。如何更改其他问题的示例代码以在此方案中工作?
他有“data.size()”,我需要像“name.size()”这样的东西 - 我想?
答案 0 :(得分:2)
在他传递一个ArrayList的地方,我必须传入三个,但是要传递给 要做到这一点,必须包装在自定义对象类中。其中一个 我想要排序的ArrayLists是该类中的三个字段之一 叫“名字”。
您没有三个ArrayLists
,您有ArrayList
个自定义对象,这些对象是由三个ArrayLists
构建的(因此大小是List
的大小您传递给适配器)。从这个角度来看,代码中唯一的变化是使用该自定义对象Items
中的名称来构建部分:
for (int i = 0; i < data.size(); i++) {
String s = data.get(i).name.substring(0, 1).toUpperCase();
if (!alphaIndexer.containsKey(s)) {
alphaIndexer.put(s, i);
}
}
// ...
没有其他变化。此外,您可能需要使用以下内容对传递给适配器的List
Items
进行排序:
Collections.sort(mData);
您的Items
类必须实现Comparable<Items>
接口:
class Items implements Comparable<Items> {
String name;
// ... rest of the code
@Override
public int compareTo(Items another) {
// I assume that you want to sort the data after the name field of the Items class
return name.compareToIgnoreCase(another.name);
}
}