2011-07-19 58 views
1

我工作的ListActivity有一個內部類是SimpleAdapter實現SectionIndexer的子類。FastScroll與自定義ListAdapter奇怪行爲實現SectionIndexer

class MySimpleAdapter extends SimpleAdapter implements SectionIndexer { 

    HashMap<String, Integer> letters; 
    Object[] sections; 
    AlphabetIndexer alphaIndexer; 
    public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data, 
      int resource, String[] from, int[] to, 
      HashMap<String, Integer> letters, Object[] sections) { 
     super(context, data, resource, from, to); 

     this.letters = letters; 
     this.sections = sections; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      convertView = getLayoutInflater().inflate(R.layout.common_image_row1, null); 
     } 

     HashMap<String, Object> data = (HashMap<String, Object>) getItem(position); 
     Integer idArtist = Integer.parseInt((String) data.get("idArtist")); 

     convertView.setTag(idArtist); 

     ((TextView) convertView.findViewById(R.id.item_name)) 
      .setText((String) data.get("sName")); 

     ImageView image = (ImageView) convertView.findViewById(R.id.item_image); 
     image.setTag((String) data.get("sImageUrl"));   
     image.setImageResource(R.drawable.default_artwork); 

     ((TextView) convertView.findViewById(R.id.item_count)) 
      .setText((String) data.get("iSongs") + " Songs"); 

     if (!bScrolling) { 
      new API.DownloadImagesTask().execute(image); 
     } 
     return convertView; 
    } 

    public int getPositionForSection(int section) { 
     String letter = (String) sections[section]; 

     return letters.get(letter); 

    } 

    public int getSectionForPosition(int position) { 
     return 0; 
    } 

    public Object[] getSections() { 
     return sections; 
    } 
} 

該活動在單獨的AysncTask中接收JSON對象。該對象由各種JSONArrays組成,這些JSONArrays的鍵是項目首字母的數組項。所以,這個數組是由一堆以字母「B」開始的項目組成的。因此,JSONArray的關鍵是「B」。

{ 
    B: ["ball", "buck", "bill"] 
    C: ["charlie", "chuck", "chap"] 
} 

該對象不一定具有字母表中的所有字母。我也知道使用JSONObjects不能保證順序,所以我對它們進行排序。
List> maps = new ArrayList>(); ArrayList sections = new ArrayList(); HashMap letters = new HashMap();

 String[] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N" 
       ,"O","P","Q","R","S","T","U","V","W","X","Y","Z"}; 
     int k = 0; 
     for (int i = 0; i < alphabet.length; i++) { 
      if (playlistArtists.optJSONArray(alphabet[i]) != null) { 
       try { 
        JSONArray artists = playlistArtists.getJSONArray(alphabet[i]); 
        sections.add(alphabet[i]); 

        for (int j = 0; j < artists.length(); j++) { 
         JSONObject artist = (JSONObject) artists.get(j); 
         HashMap<String, String> map= new HashMap<String, String>(); 
         map.put("idArtist", artist.getString("idArtist")); 
         map.put("sName", artist.getString("sName")); 
         map.put("sImageUrl", artist.getString("sImageUrl-thumb")); 
         map.put("iSongs", artist.getString("iSongs")); 
         maps.add(map); 

         letters.put(alphabet[i], k); 
         k++; 
        } 
       } catch (JSONException e) { 
        Log.d(TAG,"JSONException in Music::GetMusicCatlog.doInBackground"); 
        e.printStackTrace(); 
       } 

      } 
     } 
     SimpleAdapter adapter = new MySimpleAdapter(Catalog.this, 
       maps, 
       R.layout.common_image_row1, 
       new String[] {"idArtist","sName", "sImageUrl", "iSongs" }, 
       new int[] {R.id.item_id, R.id.item_name, R.id.item_image, R.id.item_count }, 
       letters, 
       sections.toArray()); 
     setListAdapter(adapter); 

我遇到的問題是FastScroll。我有一切工作的大部分。該列表按第一個字母分組,當使用FastScroll時,該字母出現在彈出窗口中並轉到正確的組。問題是,當我將FastScroll「跳轉」到所需列表的任意部分後,我放開FastScroll。它不會留在我放開它的位置。我認爲它會在該部分的任意位置,因爲我沒有實施SectionIndexer。我認爲問題在於這種方法。

public int getSectionForPosition(int position) { 
     return 0; 
    } 

我只是不知道如何正確地貫徹SectionIndexer方法...

+0

作爲旁註:getPositionForSection()應該返回起始索引,而不是最後一個索引(你正在做的)。所以,假設藝術家是AZ排序的,或者向後瀏覽藝術家陣列,或者只是將索引添加到字母hashmap(如果該關鍵字尚不存在)(因此您只需添加第一個索引) –

回答

-2

我看到了同樣的方式像getPositionForSection

public int getPositionForSection(int section) { 
     String letter = (String) sections[section]; 

     return letters.get(letter); 
    } 

    public int getSectionForPosition(int position) { 
     String letter = (String) sections[position]; 

     return letters.get(letter); 
    } 
+0

我改變了你的答案它有點幫助。儘管如此,它仍然不完美。在getSectionForPosition(int position)中的'String letter =(String)sections [position]' – dbaugh

+0

是的,你有權利,我的錯誤。修正了謝謝。 – vsm

+9

這對我來說沒有任何意義(僅從Android開始)。你如何在章節清單中使用物品位置?如果你有20個項目和3個部分不會getSectionForPosition()被調用的位置= 20,如果你快速滾動一路下降? –

1

TL實施了許多時間getSectionForPosition; DR先回答不可能是正確的。如果您需要執行getSectionForPosition方法的示例,請參閱here

你是對的,它看起來像你的執行getSectionForPosition的問題。 答案提供到目前爲止不可能是正確的,因爲您需要返回某個位置相關的部分的索引,而不是某個部分相關的位置(這就是您應該做的getPositionForSection)。

因此,您應該重新修改您的getSectionForPosition方法(再次)。您需要每個位置部分的有效映射。文檔說明:

給定適配器內的位置,返回段對象數組中相應節的索引。

如果您需要一個如何構建這種映射的示例,請參閱here。正確實施,它將解決跳轉滾動條的問題,而是將其正確定位。