创build与字母分隔符的列表视图 – 如何?

我有以下代码。 我需要在A元素,B等之前创build列表分隔符。 我需要这样的一些东西:A Ana A … B Bob Bill … C Cane Cod … Z Zane。 如何提供我的代码? 需要一些帮助。 我是新来的Android,我真的不知道如何解决这个问题。

main.xml中

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/myListView" android:fastScrollEnabled="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fadeScrollbars="true" android:scrollbarSize="100dp" android:scrollbarStyle="insideOverlay" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout> 

item1.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/myListView" android:fastScrollEnabled="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fadeScrollbars="true" android:scrollbarSize="100dp" android:scrollbarStyle="insideOverlay" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> <TextView android:id="@+id/textSeparator" android:layout_height="wrap_content" android:gravity="center" android:text="text" android:visibility="visible" android:layout_width="fill_parent" android:textColor="#FFFFFFFF" android:background="#FFFF0000" /> </RelativeLayout> 

的.java

 package scroll.packet; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SectionIndexer; public class FastScrollActivity extends Activity { ListView myListView; ArrayList<String> elements; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // elements String s = "QWERTZUIOPASDFGHJKLYXCVBNM"; Random r = new Random(); elements = new ArrayList<String>(); for (int i = 0; i < 300; i++) { elements.add(s.substring(r.nextInt(s.length()))); } Collections.sort(elements); // Must be sorted! // listview myListView = (ListView) findViewById(R.id.myListView); myListView.setFastScrollEnabled(true); //myListView. MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>( getApplicationContext(), android.R.layout.simple_list_item_1, elements); myListView.setAdapter(adapter); // if (myListView.getFirstVisiblePosition() > adapter.getItemId( adapter.getCount()) || myListView.getLastVisiblePosition() <= adapter.getCount()) { // myListView.smoothScrollToPosition( adapter.getCount());} } 

更新代码

  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; } } public void quickScroll(View v) { String alphabet = (String)v.getTag(); int index = 0; //find the index of the separator row view list.setSelectionFromTop(index, 0); } public static class ViewHolder { public TextView textView; } } 

Related of "创build与字母分隔符的列表视图 – 如何?"

在你的适配器中,你必须重写getViewTypeCount和getViewType

后者将得到将由getView创build的视图types(在你的情况下,视图只包含开始字母和包含名称的视图),前者将返回将创build的视图types的数量getView()