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属性...

希望这将有助于=)