2012-04-03 4 views
8

Ich habe den folgenden Code. Ich muss Listentrennzeichen vor A-Elementen, B usw. erstellen. Ich muss so etwas haben: A Ana Al ... Bob Bill ... C Cane Cod ... Z Zane. Wie kann ich meinen Code verbessern? Hilfe benötigen. Ich bin neu bei Android und ich weiß wirklich nicht, wie ich das lösen soll.create listview mit alphabetischen Trennzeichen android - wie?

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());} 

      } 

Aktualisierungscode

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; 
} 
} 
+0

erstellt werden, ist unten das hervorragende Tutorial über ListView Android Listview Divider.Ich hoffe, dass dies Ihnen helfen wird.Sie können Trennzeichen hinzufügen, ohne es zu deklarieren in XML-Datei. http://android.amberfog.com/?p=296 – himanshu

+0

Ich habe das Tutorial gesehen, aber ich weiß nicht, wie ich es an meinen Code anpassen soll :(. Kannst du bitte bitte helfen? Ich brauche die Liste in alphabetischer Reihenfolge – user1222905

Antwort

3

In Ihrem Adapter haben Sie getViewTypeCount und getViewType

diese außer Kraft setzen wird die Art der Ansicht erhalten, die von getView erstellt wird (in Ihrem Fall die Auffassung, dass nur die Anfangsbuchstaben und die Ansicht enthält das enthält den Namen), der ehemalige gibt die Anzahl der Arten von Ansichten, die von getView()

+0

Wo? Was ist das "dedrawable? Kannst du bitte exend? Ich muss A ..., B, C, .. UND so weiter als saparators. Ich meine, ich brauche etwas identisch mit der Kontaktliste in Android – user1222905

+0

für separator was meinst du? Etwas, das jedes Element deiner Listview von der nächsten trennt? – Blackbelt

+0

Ich glaube, ich habe dich missverstanden. Ich werde meine Antwort löschen – Blackbelt