Форум программистов, компьютерный форум CyberForum.ru

Список отображается не полностью - Android

Восстановить пароль Регистрация
 
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
27.04.2015, 01:31     Список отображается не полностью #1
Здравствуйте.
В общем есть listview в каждом item`е которого есть listview1
listview1 выводит только одну строчку, хотя в адаптер передается 2 и более.
Подскажите, как решить проблему отображения (мне надо, чтобы отображались все item`ы listview1
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
27.04.2015, 07:26     Список отображается не полностью #2
Приветствую.
В общем надо смотреть адаптер, ведь если пеердается 2 и более, то listview1 должен выводить не одну строчку.
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
27.04.2015, 08:43  [ТС]     Список отображается не полностью #3
Rube, вот адаптер listview1:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class TicketPositionAdapter extends BaseAdapter {
 
    private Context context;
    private ArrayList<ticket_position> ticket_positions;
    private LayoutInflater layoutInflater;
 
    public TicketPositionAdapter(Context context, ArrayList<ticket_position> ticket_positions){
        this.context = context;
        this.ticket_positions = ticket_positions;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount(){
        return ticket_positions.size();
    }
 
    @Override
    public Object getItem(int position){
        return ticket_positions.get(position);
    }
 
    @Override
    public long getItemId(int position){
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = convertView;
        if (view == null) {
            view = layoutInflater.inflate(R.layout.admin_ticket_position, parent, false);
        }
 
        ticket_position _ticket_position = (ticket_position) getItem(position);
        ((TextView) view.findViewById(R.id.admin_ticket_good_name)).setText(_ticket_position.getGood());
        ((TextView) view.findViewById(R.id.admin_ticket_good_cost)).setText(Float.toString(_ticket_position.getCost()) + " Лев");
        ((TextView) view.findViewById(R.id.admin_ticket_good_count)).setText(Integer.toString(_ticket_position.getCount()) + " шт.");
 
        return view;
    }
}


Добавлено через 1 минуту
а вот адаптер listview:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TicketAdapter extends BaseAdapter {
 
    private Context context;
    private ArrayList<ticket> tickets;
    private LayoutInflater layoutInflater;
 
    public TicketAdapter(Context context, ArrayList<ticket> tickets){
        this.context = context;
        this.tickets = tickets;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount(){
        return tickets.size();
    }
 
    @Override
    public Object getItem(int position){
        return tickets.get(position);
    }
 
    @Override
    public long getItemId(int position){
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = convertView;
        if (view == null) {
            view = layoutInflater.inflate(R.layout.ticket, parent, false);
        }
 
        ticket _ticket = (ticket) getItem(position);
 
        ((TextView) view.findViewById(R.id.admin_ticket_id)).setText(String.valueOf(_ticket.getId()));
        ((TextView) view.findViewById(R.id.admin_ticket_cashier_id)).setText(String.valueOf(_ticket.getCashier_id()));
        ((TextView) view.findViewById(R.id.admin_ticket_event_result)).setText(String.valueOf(_ticket.getEvent_result()));
        ((TextView) view.findViewById(R.id.admin_ticket_start_date)).setText(_ticket.getStart_date());
        ((TextView) view.findViewById(R.id.admin_ticket_time)).setText(String.valueOf(_ticket.getTime()));
        TicketPositionAdapter ticketPositionAdapter = new TicketPositionAdapter(this.context, _ticket.getPositions());
        ((ListView) view.findViewById(R.id.admin_ticket_good_list)).setAdapter(ticketPositionAdapter);
 
 
        return view;
    }
}
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
27.04.2015, 13:30     Список отображается не полностью #4
Не нравится мне вот это:
Цитата Сообщение от korep Посмотреть сообщение
((ListView) view.findViewById(R.id.admin_ticket_good_list)).setAdapter(ticketPositionAdapter);
Т.е. при каждом создании итема в listview сетится адаптер для listview2.
Может убрать это после вызова TicketAdapter?

Добавлено через 1 минуту
Хотя не, логично вроде.

Добавлено через 3 минуты
.notifyDataSetChanged()?
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
27.04.2015, 15:03  [ТС]     Список отображается не полностью #5
Rube,
Цитата Сообщение от Rube Посмотреть сообщение
.notifyDataSetChanged()?
это куда писать? если не ошибаюсь оно отвечает за обновление отображения списка при условии, что мы добавляем новый элемент. Но массивы, которые я передаю они потом не меняются (статичны).
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
27.04.2015, 15:18     Список отображается не полностью #6
Это метод адаптера, ну да, обновляет показ.
а _ticket.getPositions() сколько данных содержит при вызове?
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
27.04.2015, 15:23  [ТС]     Список отображается не полностью #7
обычно два и более.

Добавлено через 2 минуты
может xml item`ы нужны?
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
27.04.2015, 16:04     Список отображается не полностью #8
korep, а R.layout.admin_ticket_position это разве не итемы?
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
27.04.2015, 18:17  [ТС]     Список отображается не полностью #9
ну как бы описание то идет через xml разметку

Добавлено через 36 секунд
ну да это итемы, но сами xml файлы может нужны
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
27.04.2015, 19:46     Список отображается не полностью #10
Цитата Сообщение от korep Посмотреть сообщение
ну да это итемы, но сами xml файлы может нужны
Ничего не понял, а admin_ticket_position это не xml файл чтоли?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2015, 00:01     Список отображается не полностью
Еще ссылки по теме:

Android Полностью убить приложение
Android Не отображается ListView
Android Как полностью удалить студию (убунту)?
Удалить не полностью переданый файл через socket Android
Android Android Studio полностью круглая кнопка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
28.04.2015, 00:01  [ТС]     Список отображается не полностью #11
xml

Добавлено через 3 часа 32 минуты
В общем проблема решена.
На самом деле все нормально передается и почти хорошо работает.
В документации есть пункт о том, что не желательно использовать List`ы в List`ах (если кратко).
Т.е. ListView в ListView или ListView в ScrollView и т.д.
Это связано с тем, что все эти списки листающиеся. И возникает проблема их отображения. В данном случае единственным решением является изменение высоты внутреннего List`а после добавления новых записей.
Это можно сделать при помощи функции которую я позаимствовал здесь
Также ее можно теперь взять и здесь
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null)
        return;
 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
 
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}


Пояснение:
Во внутреннем адаптере создается listView и к нему применяется указанный выше метод.
Однако в результате мы получим, что к нашему внешнему listView будет добавляться каждый раз еще по одному списку.
для того, чтобы это избежать можно сделать вот так
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
if(view.findViewById(R.id.admin_ticket_good_listview) == null) {
            ListView listView = new ListView(context);
            listView.setId(R.id.admin_ticket_good_listview);
            listView.setAdapter(ticketPositionAdapter);
            ((LinearLayout) view.findViewById(R.id.admin_ticket_good_list)).addView(listView);
            ticketPositionAdapter.notifyDataSetChanged();
            setListViewHeightBasedOnChildren(listView);
        }

где R.id.admin_ticket_good_list - id LinearLayout`a в item`e внешнего listview
Это все конечно костыли, но без них в данном случае никак, если кто подскажет более простой метод, буду рад услышать.
Yandex
Объявления
28.04.2015, 00:01     Список отображается не полностью
Ответ Создать тему
Опции темы

Текущее время: 10:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru