如何添加部分分隔符/分隔符到ListView?

我目前正在为我的应用程序做一个菜单,使用DrawerLayout和ArrayAdapter子类来实现类似Facebook的抽屉菜单。

我目前没有创build列表的问题,但现在看起来不错,我想添加不同types的选项(即用户相关的选项和应用程序相关的选项)和菜单顶部的search栏之间的分隔符

我目前的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的函数,但是我找不到它是哪个函数。

Solutions Collecting From Web of "如何添加部分分隔符/分隔符到ListView?"

如果您想在ListView中使用简单的部分,请参阅本教程:

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

或本教程:

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

第二个不太详细,但可能更容易理解/保持简单。

基本的想法是,你让你的ListAdapter有不同种类的视图。 例如两个不同的视图,其中一种是显示信息的实际列表项,而另一种视图是分区分割器。

从教程:

ListView和更具体的适配器可以处理几种types的视图 。 如果你看看Adapter界面,你会注意到它包含两个具体的方法:

  • getViewTypeCount()返回您的AdapterViewpipe理的视图types的数量。 大多数情况下这个方法返回1,因为ListView的所有项都是相似的。 在这种情况下,通过返回2,ListView将处理两种types的视图:常规项目视图和分隔视图
  • getItemViewType(int)必须返回0(包含)和getViewTypeCount() (不包括) 之间的整数。 给定的数字表示在给定位置的视图的types。 例如,我们可以确保常规项目Views的返回值为0,分隔符的返回值为1

我在这里添加一个答案,因为我已经想通过另一种方式来解决这个问题。 它看起来有点像链接@Phil张贴。

首先我设置我想要显示的菜单的string数组。 为了个人的方便,我已经将这个数组写在一个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,我在其中添加了一些function:

 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的对象。 你并不需要注意这一点,但如果你感兴趣,这是另一个菜单元素,使用特定的布局文件,而不是我用于常规菜单元素。 这是一种certificate您可以在任何地方添加任何特定布局的方式,只需通过阅读您的string即可。

这里的要点是代码search分隔符的方式,即带有-sep-前缀的string。 一旦find一个,前缀被删除,匹配的布局归因于分隔符。

Aight,那就是我发现的。 在此之后,你将不得不find你自己的方式来添加点击监听器。 地雷是在DrawerLayout.setOnCliclListener中实现的,它基本上完成了与Google文档所说的完全相同的工作。 但是,您也可以在添加视图时使用setOnclickListener ,并使用XML文件设置自己的onClick属性。

希望它会帮助=)