Как добавить разделители / разделители разделов в 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/

или в этом уроке:

http://bartinger.at/listview-with-sectionsseparators/

второй не так подробно, но, вероятно, легче понять / сохранить упроститься.

основная идея заключается в том, что вы сделать свой 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 атрибуты...

надеюсь, это поможет =)