如何在Android中创建带字母分隔符的ListView?

10

我有以下代码。我需要在A元素、B元素等之前创建列表分隔符。我需要像这样:A Ana Al...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;
}
}

以下是关于Android ListView分割线的优秀教程。希望这能对您有所帮助。您可以在不声明XML文件中的情况下添加分隔符。http://android.amberfog.com/?p=296 - himanshu
我看过教程,但不知道如何将其适应于我的代码:(。你能帮忙吗?我需要列表按字母顺序排列。 - user1222905
1个回答

3
在您的适配器中,您需要重写getViewTypeCountgetViewType方法。
后者将获取由getView创建的View的类型(在您的情况下,包含仅起始字母的视图和包含名称的视图),前者将返回由getView()创建的View类型的数量。

在哪里?“yourdrawable”是什么?您能否请扩展一下?我需要像A、B、C等分隔符一样的东西。我的意思是,我需要与Android联系人列表相同的东西。 - user1222905
分隔符是什么意思?它是指用于在列表视图中将每个元素与下一个元素分隔开的东西吗? - Blackbelt
我想我误解了你。我会删除我的回答。 - Blackbelt
我已经更新了我的代码。我没有任何错误,但它没有正确地工作。需要一些帮助:) 我需要在以A开头的单词之前加上分隔符,以B开头的单词和...直到Z。 - user1222905
好的。我已经更新了我的代码,但还是不起作用。所有元素A、B、C、D都是分隔符。我错在哪里了?我只需要一个分隔符。 - user1222905
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接