Как добавить разделители / разделители разделов в ListView?
в настоящее время я делаю меню для своего приложения, используя 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;
}
}
Я предполагаю, что мне нужно переопределить функцию, которая заполняет ListView, вызвав функцию getView, но я не могу найти, какая это функция.
2 ответов
Если вы хотите просто разделы в вашем ListView, взгляните на этот учебник:
http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/
или в этом уроке:
второй не так подробно, но, вероятно, легче понять / сохранить упроститься.
основная идея заключается в том, что вы сделать свой ListAdapter есть разные мнения. например, два разных вида, где один вид является фактическим элементом списка, отображающим информацию, а другой вид-разделителем разделов.
из учебника:
ListViews и более конкретно адаптеры могут обрабатывать несколько типов представлений. Если вы посмотрите на интерфейс адаптера вы заметите это содержит два конкретных метода:
-
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>
обратите внимание, что у меня есть два элемента, используя префикс -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
который в основном делает работу точно так же, как говорится в документации Google. Но вы также можете использовать setOnclickListener
к вашему представлению, как вы добавляете их, и использовать XML-файл, где вы можете установить свой собственный onClick
атрибуты...
надеюсь, это поможет =)