32

我目前正在爲我的應用製作一個菜單,使用DrawerLayout和ArrayAdapter子類來實現類似Facebook的抽屜菜單。如何將分隔符/分隔符添加到ListView?

我目前沒有創建列表的問題,但現在看起來不錯,我想在不同類型的選項(即用戶相關的選項和應用程序相關的選項)和搜索欄之間添加分隔符菜單。

我目前ArrayAdaptor子類的代碼如下:

public class DrawerMenuAdapter extends ArrayAdapter<String>{ 
    private Context context; 
    private String[] values; 
    private int resId; 

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) { 
     super(context, textViewResourceId, values); 
     this.context = context; 
     this.values = values; 
     this.resId = textViewResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(this.resId, parent, false); 

     TextView elementText = (TextView)rowView.findViewById(R.id.element_text); 
     ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon); 
     String textValue = values[position]; 

     elementText.setText(textValue); 

     //This switch adds the icons to the related elements 
     switch (position){ 
      case 0: 
       elementImage.setImageResource(R.drawable.search); 
       break; 
      case 1: 
       elementImage.setImageResource(R.drawable.facebook_friends); 
       break; 
      case 2: 
       elementImage.setImageResource(R.drawable.flirts_history); 
       break; 
      case 3: 
       elementImage.setImageResource(R.drawable.premium); 
       break; 
      case 4: 
       elementImage.setImageResource(R.drawable.settings); 
       break; 
      case 5: 
       elementImage.setImageResource(R.drawable.share_app); 
       break; 
      case 6: 
       elementImage.setImageResource(R.drawable.cgu); 
       break; 
     } 


     return rowView; 
    } 
} 

我認爲我必須重寫通過調用getView函數填充ListView控件的功能,但我找不到它的功能它是。

回答

37

如果你想在你的ListView簡單部分,看看這個教程:

http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/

或本教程:

http://bartinger.at/listview-with-sectionsseparators/

第二個不是很詳細,但可能更容易理解/保持簡單。

基本思路是你使你的ListAdapter有不同種類的視圖。例如兩個不同的視圖,其中一種是顯示信息的實際列表項目,另一種視圖是分區分割器。

從教程:

列表視圖,更具體適配器可以處理多種類型的瀏覽的。如果你看一看適配器接口,你會發現它包含兩個具體方法:

  • getViewTypeCount()返回的類型你 適配器視圖管理意見的數量。大多數情況下,此方法返回1,因爲 ListView的所有項都是類似的。在這種情況下,通過返回2, ListView控件將處理兩種意見:對經常項目視圖 和分離器視圖
  • getItemViewType(int)必須返回之間 0(含) getViewTypeCount()(不含)的整數。給定的數字表示View在給定位置的類型 。例如,我們可以保證 返回的值都爲 分離
+1

都能跟得上,這可能是有用的,但這不是我要找的。 [PIC RELATED](http://www.pocketables.com/images/2013/01/Pages-Manager-1.png)這就是我試圖製作的那種菜單,用這種分隔符「Your頁面「和保存幫助中心的部分。 – Jivay

+0

那我一定誤會了。你能解釋更具體的嗎?你在找什麼? –

+0

編輯,按下輸入沒有完成。我想在我的ListView的特定部分之間放置一個特定的分隔符,並在此分隔符上放置一個標題。 – Jivay

7

我在這裏增加一個答案,因爲我已經想通另一種方式來對這個0爲經常項目視圖和1。它看起來有點像@Phil發佈的鏈接。

首先我設置了我想要顯示的菜單的字符串數組。爲了個人的方便,我已經將這個數組寫在一個XML資源文件中。

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array 
      name="drawer_menu_options"> 
     <item>Username</item> 
     <item>-sep-Flirter</item> 
     <item>Recherche</item> 
     <item>Amis Facebook</item> 
     <item>Flirts</item> 
     <item>Compte premium</item> 
     <item>-sep-Menu</item> 
     <item>Réglages</item> 
     <item>Inviter des amis</item> 
     <item>CGU</item> 
    </string-array> 
</resources> 

請注意,我有兩個元素使用前綴-sep-。這些將是我們的分隔符。

然後是DrawerMenuAdapter我已經提到的方式,這仍然是一個ArrayAdapter,關於這一點我已經添加了一些功能:

public class DrawerMenuAdapter extends ArrayAdapter<String>{ 
    private Context context; 
    private String[] values; 
    private int resId; 
    private int separatorId = 0; 
    private int userbarId = 0; 

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) { 
     super(context, textViewResourceId, values); 
     this.context = context; 
     this.values = values; 
     this.resId = textViewResourceId; 
    } 

    public void setSeparator(int resId){ 
     separatorId = resId; 
    } 

    public void setUserbarId(int resId){ 
     userbarId = resId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     View rowView; 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if(userbarId != 0 && values[position].equals("Username")){ 
      rowView = inflater.inflate(this.userbarId, parent, false); 

     }else if(separatorId != 0 && values[position].startsWith("-sep-")){ 
      rowView = inflater.inflate(this.separatorId, parent, false); 

     }else{ 
      rowView = inflater.inflate(this.resId, parent, false); 
     } 

     TextView elementText = (TextView)rowView.findViewById(R.id.element_text); 
     String textValue = values[position]; 

     /* If the current line is a separator, just display a separator. Otherwise, set the 
     matching picture 
     */ 
     if(textValue.startsWith("-sep-")){ 
      elementText.setText(textValue.substring("-sep-".length())); 

     }else{ 
      if(textValue.equals("Username")){ 
       elementText.setText(context.getSharedPreferences("LovRUserSettings", 0) 
         .getString("firstName", "Username")); 
      }else{ 
       elementText.setText(textValue); 
      } 
      ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon); 
      switch (position){ 
       case 2: 
        elementImage.setImageResource(R.drawable.search); 
        break; 
       case 3: 
        elementImage.setImageResource(R.drawable.facebook_friends); 
        break; 
       case 4: 
        elementImage.setImageResource(R.drawable.flirts_history); 
        break; 
       case 5: 
        elementImage.setImageResource(R.drawable.premium); 
        break; 
       case 7: 
        elementImage.setImageResource(R.drawable.settings); 
        break; 
       case 8: 
        elementImage.setImageResource(R.drawable.share_app); 
        break; 
       case 9: 
        elementImage.setImageResource(R.drawable.cgu); 
        break; 
      } 
     } 


     return rowView; 
    } 
} 

在這段代碼中,有一個名爲userBar的對象。你不需要注意這一點,但如果你有興趣,它是另一個菜單元素,使用特定的佈局文件,而不是我用於常規菜單元素的佈局文件。這是一種證明您可以隨時隨地添加任何特定佈局的方式,只需通過閱讀您的字符串即可。

這裏的要點在於代碼搜索分隔符的方式,即前綴爲-sep-的字符串。一旦找到一個,前綴將被刪除,匹配的佈局歸因於分隔符。

Aight,這就是我找到的。之後,你必須找到你自己的方式來添加點擊監聽器。地雷在DrawerLayout.setOnCliclListener中實施,基本上完成工作的方式與Google文檔所說的完全相同。但你也可以使用setOnclickListener你的看法,你添加它們,並使用XML文件,你可以設置自己的onClick屬性...

希望這將有助於=)