我正在为我的应用程序制作菜单,使用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的函数,但我找不到它是哪个函数。
答案 0 :(得分:38)
如果您想在ListView中使用简单的部分,请查看本教程:
http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/
或本教程:
第二个不是那么详细,但可能更容易理解/更简单。
基本的想法是你使你的ListAdapter有不同类型的视图。例如两个不同的视图,其中一种是显示信息的实际列表项,另一种是视图是部分分割器。
从教程:
ListViews,更具体地说,适配器可以处理多种类型的视图。如果你看一下Adapter接口,你会发现它包含两个特定的方法:
getViewTypeCount()
,返回您的观看类型的数量
AdapterView管理。大多数情况下,此方法返回1,因为
ListView的所有项目都是类似的。在这种情况下,通过返回2,
ListView将处理两种类型的视图:常规项目视图
和分隔符视图getItemViewType(int)
必须返回 0(含)和之间的整数
getViewTypeCount()
(独家)。给定的数字表示类型
在给定位置的视图。例如,我们可以确保
返回值为0表示常规项目视图,1表示
分离器答案 1 :(得分:7)
我在这里添加了一个答案,因为我已经找到了另一种方法。它看起来有点像@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
属性...
希望它会有所帮助=)