2012-04-03 19 views
8

Mam następujący kod. Muszę utworzyć separatory list przed Elementami, B i tak dalej. Muszę coś takiego: A Ana Al ... B Bob Bill ... C Cane Cod ... Z Zane. Jak wprowadzić kod? potrzebuję pomocy. Jestem nowy dla Androida i naprawdę nie wiem, jak rozwiązać ten problem.utworzyć listę z separatorami alfabetu android - jak?

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

      } 

KOD UPDATE

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

Poniżej znajduje się doskonały samouczek dotyczący dzielenia listy wyświetleń Androida listview. Mam nadzieję, że to ci pomoże. Możesz dodać separator bez deklarowania w pliku xml. http://android.amberfog.com/?p=296 – himanshu

+0

Widziałem samouczek, ale nie wiem, jak dostosować go do mojego kodu :(Czy możesz proszę o pomoc? Potrzebuję, żeby lista była w kolejności alfabetycznej – user1222905

Odpowiedz

3

W adaptera trzeba zastąpić getViewTypeCount i getViewType

ten ostatni otrzyma typ widoku, który zostanie utworzony przez getView (w przypadku, że zawiera tylko literę początkową i widok który zawiera nazwę), pierwszy zwróci liczbę typów widoków, które zostaną utworzone przez getView()

+0

gdzie? co to jest "do wypłaty? Czy mogę wyjechać? Potrzebuję mieć A ..., B, C, .. I SO jako saparatorów.Mam na myśli potrzebuję czegoś identycznego z listy kontaktów w Androidzie – user1222905

+0

dla separatora, co masz na myśli? Coś, co oddziela każdy element listview od następnego? – Blackbelt

+0

Myślę, że źle cię zrozumiałem. Ja usunę moją odpowiedź – Blackbelt

Powiązane problemy