создать список с буквенными разделителями android - как?

У меня есть следующий код. Мне нужно создать разделители списков перед элементами A, B и так далее. Мне нужно что-то вроде этого: A Ана Эл... B Боб Билл... C Тростниковая треска... Z Зейн. Как улучшить мой код? нужна помощь. Я новичок в 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;
}
}
10
задан user1222905 3 April 2012 в 08:57
поделиться