Страница 1 из 3

Категоризация в ListView

Добавлено: 27 апр 2015, 17:39
Lucifer777
Всем привет!
Интересует как сделать вот такой список:Изображение

Не знаю как так сделать, что бы название категории списка была на том же уровне, что и первая ячейка из этой категории.
Наткнулся на парочку библиотек, которые это позволяют но пахнет всё это каким-то страшными костылями. Как нативно это реализуется?

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 18:12
Foenix
кастомный листвью, где слева картинка, буква, меняющая свою видимость. Очень простенько.

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 18:15
Lucifer777
Foenix писал(а):кастомный листвью, где слева картинка, буква, меняющая свою видимость. Очень простенько.
не думал, что настолько простенько.

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 18:18
Foenix
так а что сложного-то?

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 19:35
Mikhail_dev
а как убираются dividers между айтемами? Я пока сам особо не понял как это делается, хотя понятно что тут нет магии

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 22:21
Foenix
а там параметр был так как-то и назывался - дивайдерс=0 , в общем что-то такое

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 22:29
doter.ua
Mikhail_dev писал(а):а как убираются dividers между айтемами? Я пока сам особо не понял как это делается, хотя понятно что тут нет магии
android:divider="@null"
android:dividerHeight="0dp"

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 22:34
Mikhail_dev
Да я понимаю как его убрать, я не понимаю как его сделать чтобы он показывался в определенных случаях. Вы же видите что он есть, а в некоторых случаях его нет.

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 22:42
doter.ua
Mikhail_dev писал(а):Да я понимаю как его убрать, я не понимаю как его сделать чтобы он показывался в определенных случаях. Вы же видите что он есть, а в некоторых случаях его нет.
TextView
visibility gone
height 1dp
width match_parent
+ padding
----------------------------------
if ( bla bla ) tv.visibility=visible

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 22:52
Mikhail_dev
А, т.е. делаем скрытым дивайдеры у ListView, добавляем свою View как divider И там уже пользуемся условием. В принципе да, будет работать. Спасибо.

Re: Категоризация в ListView

Добавлено: 27 апр 2015, 23:49
Foenix
это не дивайдер, а полоска нарисованная, видно же что не сначала.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 09:52
Lucifer777
Foenix писал(а):так а что сложного-то?
Я предполагал, что добавили какой-нибудь метод/свойство/интерфейс который позволяет с таким header оформить список.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 09:55
doter.ua
Lucifer777 писал(а):
Foenix писал(а):так а что сложного-то?
Я предполагал, что добавили какой-нибудь метод/свойство/интерфейс который позволяет с таким header оформить список.
Осваивай КастомныйАдаптер extends ArrayAdapter - пригодится не один раз.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 10:37
Mikhail_dev
А я всегда использую BaseAdapter. Посмотрел на ArrayAdapter, он по сути типизированный BaseAdapter, но я не понял как в нём данные изменять. Как это делается? К примеру мне пришла новая коллекция данных.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 10:47
doter.ua
Mikhail_dev писал(а):А я всегда использую BaseAdapter. Посмотрел на ArrayAdapter, он по сути типизированный BaseAdapter, но я не понял как в нём данные изменять. Как это делается? К примеру мне пришла новая коллекция данных.
А как ты меняешь в BaseAdapter-е?

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 11:04
Mikhail_dev
Написал дополнительный метод setData, там подменяю коллекцию и notifyDataChanged вызываю

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 11:14
doter.ua
Mikhail_dev писал(а):Написал дополнительный метод setData, там подменяю коллекцию и notifyDataChanged вызываю
Ну тоже самое: в Активити меняешь\обновляешь коллекцию(аррей лист), которую передаешь в конструкторе. и вызываешь у адаптора нотифай... Если в адаптере, то в конструкторе нужно сохранить ссылку на коллекцию и создать отдельный метод для обновления как у БейзАдаптера.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 11:18
Mikhail_dev
Что значит тоже самое? =) я передаю в метод её, а в ArrayAdapter'e вы создаёте новый экземпляр адаптера, чтобы обновить данные. Это, извините, вообще разные вещи.

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 11:21
doter.ua
Пример:

Код: Выделить всё

public class MyClassAdapter extends ArrayAdapter<MyClass> {
    private Activity mActivity;
    private List<MyClass> list;

    public TenderAdapter(Activity activity, List<MyClass> list) {
        super(activity, R.layout.li_item_tender, list);
        this.mActivity = activity;
        this.list = list;
    }

    public class ViewHolder {
        public TextView tvName;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        View rowView = convertView;

        if (rowView == null) {
            LayoutInflater inflater = mActivity.getLayoutInflater();
            rowView = inflater.inflate(R.layout.li_item_tender, null, true);
            holder = new ViewHolder();

            holder.tvName= (TextView) rowView.findViewById(R.id.tvName);

            rowView.setTag( holder );
        } else {
            holder = (ViewHolder) rowView.getTag();
        }

        MyClass item = getItem(position);

        holder.tvName.setText( item.getName() );

        return rowView;
    }
}
П.С. где item- экзмепляр класса-контейнера, написанного спецом для адаптера
МайКласс (){
String name;
//getters setters constructors...
}
Никакие дополнительные методы типа гетКаунт гетОбдект и т.д. не нужны (добавляются по желанию).
В активити в конструктор адаптера передается (контекст, аррейлист<МайКласс>)

Re: Категоризация в ListView

Добавлено: 28 апр 2015, 11:22
doter.ua
Mikhail_dev писал(а):Что значит тоже самое? =) я передаю в метод её, а в ArrayAdapter'e вы создаёте новый экземпляр адаптера, чтобы обновить данные. Это, извините, вообще разные вещи.
новый адаптер не создается, Просто изменяется дата аррейлиста и вызывается нотифай. Про передачу в конструкторе к тому, что передается ссылка, и можно менять исходный аррейлист (который передавался в конструкторе при создании) и обновления прокатят.