Jiv*_*vay 33 android separator android-layout android-listview android-adapter
我正在为我的应用程序制作一个菜单,使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设我必须通过调用getView函数来覆盖填充ListView的函数,但是我找不到它是哪个函数.
Phi*_*oda 38
如果您想在ListView中使用简单的部分,请查看本教程:
http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/
或者本教程:
第二个不是那么详细,但可能更容易理解/保持更简单.
基本思想是让ListAdapter具有不同类型的视图.例如,两个不同的视图,其中一种是显示信息的实际列表项,另一种是视图的截面分隔符.
从教程:
ListViews,更具体地说,Adapters可以处理几种类型的视图.如果你看一下Adapter接口,你会发现它包含两个特定的方法:
getViewTypeCount()它返回AdapterView管理的视图类型的数量.大多数情况下,此方法返回1,因为ListView的所有项都相似.在这种情况下,通过返回2,ListView将处理两种类型的视图:常规项视图和分隔符视图getItemViewType(int)必须返回0(包括)和(不包括)
之间的整数getViewTypeCount().给定的数字表示给定位置的视图类型.例如,我们可以确保常规项视图的返回值为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>
Run Code Online (Sandbox Code Playgroud)
请注意,我有两个使用前缀的元素-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;
}
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,有一个名为的对象userBar.你真的不需要注意这个,但如果你感兴趣,它是另一个菜单元素,使用特定的布局文件而不是我用于常规菜单元素的文件.这是一种证明您可以在任何地方添加任何类型的特定布局的方法,只需阅读您的字符串即可.
这里的要点是代码搜索分隔符的方式,即带-sep-前缀的字符串.找到一个后,将删除前缀,并将匹配的布局归因于分隔符.
Aight,这就是我发现的.在此之后,您必须找到自己的方式来添加单击侦听器.实施矿井DrawerLayout.setOnCliclListener的工作基本上与Google的文档所说的完全相同.但是,您也可以setOnclickListener在添加它们时使用视图,并使用XML文件,您可以在其中设置自己的onClick属性...
希望它会有所帮助=)
| 归档时间: |
|
| 查看次数: |
67874 次 |
| 最近记录: |