Как добавить разделители разделов/разделителей в 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, но я не могу найти, какая функция она есть.
Ответы
Ответ 1
Если вам нужны простые разделы в ListView, посмотрите на это руководство:
http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/
или этот учебник:
http://bartinger.at/listview-with-sectionsseparators/
Второй вариант не такой подробный, но, вероятно, проще понять/упростить.
Основная идея заключается в том, что вы создаете у вашего ListAdapter разные виды просмотров.. Например, два разных представления, где один вид - это фактический элемент списка, отображающий информацию, а другой вид представления - это Разделитель разделов.
Из учебника:
ListViews и более конкретно Адаптеры могут обрабатывать несколько типов представлений. Если вы посмотрите на интерфейс адаптера, вы заметите, что он содержит два конкретных метода:
-
getViewTypeCount()
, который возвращает количество типов просмотров ваших
AdapterView управляет. В большинстве случаев этот метод возвращает 1, потому что
все элементы ListView аналогичны. В этом случае, возвращая 2,
ListView будет обрабатывать два типа представлений: обычный элемент Views
и разделители Views
-
getItemViewType(int)
должно возвращать целое число между 0 (включительно) и
getViewTypeCount()
(эксклюзивный). Данное число выражает тип
вида в данной позиции. Например, мы можем обеспечить
возвращаемые значения равны 0 для обычного элемента Views и 1 для
Сепараторы
Ответ 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
, который в основном выполняет работу точно так же, как говорит документация Google. Но вы также можете использовать setOnclickListener
для своего представления при их добавлении и использовать файл XML, в котором вы можете установить свои собственные атрибуты onClick
...
Надеюсь, что это поможет =)