【发布时间】:2012-04-17 04:24:09
【问题描述】:
我有一个带有自定义 Adapter 的 ListView 。我必须在位置 2,6,9 处添加分隔符。怎么做?
这是我的代码
class MyIndexerAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {
ArrayList<String> myElements;
HashMap<String, Integer> alphaIndexer;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
TreeSet mSeparatorsSet = new TreeSet();
String[] sections;
LayoutInflater mInflater;
public MyIndexerAdapter(Context context, int textViewResourceId,
List<T> objects) {
super(context, textViewResourceId, objects);
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
myElements = (ArrayList<String>) objects;
// here is the tricky stuff
alphaIndexer = new HashMap<String, Integer>();
// in this hashmap we will store here the positions for
// the sections
int size = elements.size();
for (int i = size - 1; i >= 0; i--) {
String element = elements.get(i);
alphaIndexer.put(element.substring(0, 1), i);
//We store the first letter of the word, and its index.
//The Hashmap will replace the value for identical keys are putted in
}
// now we have an hashmap containing for each first-letter
// sections(key), the index(value) in where this sections begins
// we have now to build the sections(letters to be displayed)
// array .it must contains the keys, and must (I do so...) be
// ordered alphabetically
Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets
// cannot be sorted...
Iterator<String> it = keys.iterator();
ArrayList<String> keyList = new ArrayList<String>(); // list can be
// sorted
while (it.hasNext()) {
String key = it.next();
keyList.add(key);
}
Collections.sort(keyList);
sections = new String[keyList.size()]; // simple conversion to an
// array of object
keyList.toArray(sections);
// ooOO00K !
}
public int getItemViewType(int position)
{
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
public int getViewTypeCount()
{
return TYPE_MAX_COUNT;
}
public int getPositionForSection(int section) {
// Log.v("getPositionForSection", ""+section);
String letter = sections[section];
return alphaIndexer.get(letter);
}
public int getSectionForPosition(int position) {
// you will notice it will be never called (right?)
Log.v("getSectionForPosition", "called");
getSections();
return 0;
}
public Object[] getSections() {
return sections; // to string will be called each object, to display
// the letter
}
public void onListItemClick(ListView parent,View v, int position, long id)
{
Toast.makeText(getContext(), "you have selected" + elements.get(position), Toast.LENGTH_SHORT).show();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
System.out.println("getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.main, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
//break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.item1, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(elements.get(position));
return convertView;
}
}
}
【问题讨论】:
-
您的两个单元格(您在适配器、main 和 item1 中膨胀的单元格)都包含一个列表视图,这不是您想要的吗?请更新...
-
不知道怎么更新。我有一个列表视图和一个分隔符。好的。我已经更新了我的代码。你能给我一个解决方案吗?
标签: android listview indexer list-separator