如何将部分分隔符/分隔符添加到 ListView?
Posted
技术标签:
【中文标题】如何将部分分隔符/分隔符添加到 ListView?【英文标题】:How to add section separators / dividers to a ListView? 【发布时间】:2013-08-20 13:58:47 【问题描述】:我目前正在为我的应用程序制作菜单,使用 DrawerLayout 和 ArrayAdapter 子类来实现类似于 Facebook 抽屉菜单的功能。
我目前在创建列表时没有问题,但现在看起来不错,我想在不同类型的选项(即与用户相关和与应用程序相关的选项)之间添加分隔符,并在列表顶部添加一个搜索栏菜单。
我当前的 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 的函数,但我找不到它是哪个函数。
【问题讨论】:
【参考方案1】:如果您想要简单的 ListView 中的部分,请查看本教程:
http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/
或本教程:
http://bartinger.at/listview-with-sectionsseparators/
第二个没有那么详细,但可能更容易理解/保持简单。
基本思想是您让您的 ListAdapter 具有不同类型的视图。 例如,两个不同的视图,其中一种是显示信息的实际列表项,另一种视图是部分分隔符。
来自教程:
ListViews,更具体地说是适配器可以处理多种类型的视图。如果你看一下 Adapter 接口,你会发现它包含两个特定的方法:
getViewTypeCount()
返回您的视图类型的数量
AdapterView 管理。大多数情况下,此方法返回 1,因为
ListView 的所有项目都是相似的。在这种情况下,通过返回 2,
ListView 将处理两种类型的视图:常规项目视图
和分隔视图
getItemViewType(int)
必须返回介于 0(含)和
getViewTypeCount()
(独家)。给定的数字表示类型
给定位置的视图。例如,我们可以确保
返回值为 0 用于常规项目 Views 和 1 用于
分隔符
【讨论】:
不,这可能很有用,但这不是我想要的。 PIC RELATED 这就是我正在尝试制作的菜单,在“您的页面”和包含帮助中心的部分之间使用这种分隔符。 那我一定是误会了。你能更具体地解释一下吗?你在找什么? 已编辑,未完成就按 Enter。我想在我的 ListView 的特定部分之间放置一个特定的分隔符,并在此分隔符上放置一个标题。 第二个链接比较简单,对我有帮助。【参考方案2】:我在这里添加了一个答案,因为我已经找到了另一种方法来解决这个问题。它看起来有点像@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-
前缀的字符串。一旦找到一个,前缀就被移除,匹配的布局被归于分隔符。
好吧,这就是我发现的。在此之后,您必须找到自己的方式来添加点击侦听器。地雷是在DrawerLayout.setOnCliclListener
中实现的,它的工作方式基本上与谷歌文档所说的完全相同。但您也可以在添加视图时使用 setOnclickListener
到您的视图中,并使用 XML 文件在其中设置您自己的 onClick
属性...
希望对您有所帮助 =)
【讨论】:
以上是关于如何将部分分隔符/分隔符添加到 ListView?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Listview.Separated 在列表的开头和结尾添加分隔符
Flutter:如何将 StreamBuilder 与 ListView.separated 一起使用