sadr0b0t / vkurse

Automatically exported from code.google.com/p/vkurse
0 stars 0 forks source link

Добавить номер аудитории в список с расписанием #44

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
В список с расписанием нужно добавить 
номер аудитории.

Для этого придется немного усложнить 
лэйаут для каждого элемента списка - нужно 
разбить их на 2 строки:

Выпуклый анализ
09:00-11:15          112

Математика
12:00-14:15          121

simple_list_item1 Для этих целей уже не подойдет - 
нужно создать свой лэйаут-файл, который 
будет задавать внешний вид элемента 
списка, и загружать в него значения внутри 
активити в своем собственном 
лист-адаптере. Ничего сложного, но нужно 
разобраться. Первый пример, который 
нашелся по ключевым словам "android custom list adapter":
http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters
/

Самую интересную часть смотреть в середине 
страницы:

private class OrderAdapter extends ArrayAdapter<Order> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...

Если будут вопросы с пониманием этого 
механизма - спрашиваем здесь - я все отвечу.

Original issue reported on code.google.com by bender...@gmail.com on 1 Dec 2010 at 12:30

GoogleCodeExporter commented 9 years ago
Я создала новый класс ScheduleItem
public class ScheduleItem {
    public String ListLeft; //содержит время и название занятия
    public String ListRight;//содержит номер аудитории

    public String getListLeft() {
        return ListLeft;
    }
    public void setListLeft(String ListLeft) {
        this.ListLeft = ListLeft;
    }
    public String getListRight() {
        return ListRight;
    }
    public void setListRight(String ListRight) {
        this.ListRight = ListRight;
    }
}

создала новый row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip"
    android:background="@color/grey">
    <TextView
            android:id="@+id/lefttext"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        android:textSize="25sp"
        android:textColor="@color/white"
        android:gravity="center_vertical" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">
        <TextView
            android:id="@+id/righttext"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:textSize="25sp"
            android:textColor="@color/white"
            android:gravity="center_vertical"
        />

    </LinearLayout>
</LinearLayout>

описываю новый класс:
private class ScheduleItemAdapter extends ArrayAdapter<ScheduleItem> {

        private ArrayList<ScheduleItem> items;

        public ScheduleItemAdapter(Context context, int textViewResourceId, ArrayList<ScheduleItem> items) {
                super(context, textViewResourceId, items);
                this.items = items;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.row, null);
                }
                ScheduleItem o = items.get(position);
                if (o != null) {
                    TextView lt = (TextView) v.findViewById(R.id.lefttext);
                    TextView rt = (TextView) v.findViewById(R.id.righttext);
                    if (lt != null) {
                          lt.setText(o.getListLeft());                            }
                    if(rt != null){
                          rt.setText(o.getListRight());
                    }
            }
                return v;
        }

для загрузки данных в ArrayList<ScheduleItem>
private void getData(ScheduleItem[] Answer)
            //private ArrayList<ScheduleItem> m_orders = null; глобально
            //private ScheduleItemAdapter m_adapter; глобально
    {
        try{
            if(Answer.length!=0){
                for (int i=0; i<Answer.length+1;i++)
                {
                    m_orders.add(Answer[i]);
                }
            }
            Log.i("ARRAY", ""+ m_orders.size());
          } catch (Exception e) { 
            Log.e("BACKGROUND_PROC", e.getMessage());
          }

    }
для отображения расписания 
void displayScheduleInGUI(final ScheduleItem[] Answer){

    m_orders = new ArrayList<ScheduleItem>();
    getData(Answer);
        this.m_adapter = new ScheduleItemAdapter(this, R.layout.row, m_orders);
        setListAdapter(this.m_adapter);

    getListView().setTextFilterEnabled(true);

    }
в результате ничего не работает, но в m_orders 
данные записываются правильно

Original comment by olga.tit...@gtempaccount.com on 3 Dec 2010 at 9:40

GoogleCodeExporter commented 9 years ago
На первый взгляд выглядит нормально. 
Зачекинь текущую версию в svn.

Original comment by bender...@gmail.com on 3 Dec 2010 at 11:25

GoogleCodeExporter commented 9 years ago
Выложила

Original comment by olga.tit...@gtempaccount.com on 3 Dec 2010 at 12:10

GoogleCodeExporter commented 9 years ago
> for (int i=0; i<Answer.length+1;i++)

Нужно было увидеть это сразу - в условии 
"Answer.length+1" "+1" очевидно лишний. Т.к. 
индексация начинается с нуля, цикл на 
последнем элементе выходит за границу и 
срубается на эксепшене.

Конструкция самого метода также черезчур 
многословна - достаточно таких строчек:

private void getData(ScheduleItem[] Answer)
    for (int i = 0; i < Answer.length; i++) {
        m_orders.add(Answer[i]);
    }
}

без лишних проверок на длину массива (эта 
проверка уже включена в цикл for - если на 
что-то здесь можно проверять, то если 
только null) и траев с кетчами.

С этим маленьким изменением в списке 
появляются элементы - правда все 
разъезжается, но это уже другой вопрос - 
нужно править row.xml.

По поводу нового класса SheduleItem - завести его 
дело конечно хозяйское, но вообще говоря он 
лишний - в ScheduleItemAdapter лучше передавать 
сразу массив объектов "Schedule" и внутри 
метода getView уже определять какие его поля 
отправлять влево, какие вправо, а какие 
вниз или еще куда-нибудь. Настоятельно 
рекомендую от него избавиться.

По поводу того, что все разъезжается. Я 
говорил, как должен выглядеть список:
Выпуклый анализ
09:00-11:15          112

Математика
12:00-14:15          121

Для этого в row.xml должно быть не 2 текстовых 
поля, а 3 (здесь опять возвращаемся к ScheduleItem, 
у которого сейчас всего 2 элемента - не 
стоит его расширять дополнительным 
свойством, а лучше сразу передавать 
элемент Lecture в адаптер).

В row.xml этот лэйаут будет выглядеть примерно 
так:
<LinearLayout orientation="vertical">
    <TextView width="fill_parent" id="lecture_name"/>
    <LinearLayout orientation="horizontal" width = "fill_parent">
        <TextView width="0dip" weight="1" id="lecture_time"/>
        <TextView width="wrap_content" weight="0" id="lecture_room"/>
    </LinearLayout>
</LinearLayout>

Еще замечания по коду:

- В Java принято имена любых переменных 
(локальные переменные внутри методов, 
параметры методов, атрибуты классов и т.п) 
называть с маленькой буквы - например:
    private void getData(ScheduleItem[] Answer) лучше заменить на 
    private void getData(ScheduleItem[] answer)
и в других местах аналогично

- Кодировка всех файлов должна быть UTF-8 - 
исправляется например в настройках 
проекта в самом верхнем разделе Resources или 
лучше сразу в глобальных свойствах эклипса 
- Window/Preferences/General/Workspace. Я понимаю, что cp1251 
скорее всего был выставлен по умолчанию, но 
на будущее вообще забудьте, что бывают 
любые другие кодировки, кроме юникода (UTF-8, 
UTF-16 и т.п - никаких CP, KOI, ISO и т.п) и всегда 
проверяйте, что ваши текстовые файлы, если 
в них встречаются русские символы, 
записаны именно в ней.

- Русские комментарии в коде прощаю, но 
вообще на будущее если будете продолжать 
писать код рекомендую использовать 
английский.

- Строковые сообщения из SheduleActivity, которые 
встречаются в интерфейсе (например которые 
появляются в верхней статусной строке) 
нужно вынести в strings.xml и добывать оттуда 
методом getString(R.string.message_id)

Original comment by bender...@gmail.com on 4 Dec 2010 at 10:18

GoogleCodeExporter commented 9 years ago
Vkurse_Android_v1.04.apk

Только, по-моему, формат расписания

                  название предмета
время              аудитория  

гораздо удобнее. Его я и реализовала.

Original comment by olga.tit...@gtempaccount.com on 6 Dec 2010 at 1:13

GoogleCodeExporter commented 9 years ago
Спасибо, все работает.

>Только, по-моему, формат расписания

Мне кажется, что отводить только половину 
экрана на название предмета все-таки не 
очень хорошо - если название будет 
достаточно длинным (конечно всегда можно 
вбить название такой длинны, что поплывет 
любой лэйаут, но в текущей реализации он 
поплывет гораздо раньше).

Если хочется сакцентировать внимание на 
времени, лучше или написать его крупным 
шрифтом (а шрифт с названием предмета еще 
уменьшить), или поменять местами время и 
номер аудитории (время перенести вправо, 
выделение крупным шрифтом можно все равно 
использовать):

Выпуклый анализ
112             09:00-11:15
Математика
121             12:00-14:15

Или сделать так, как ты предложила, но 
сильно уменьшить отступ справа (при этом 
начало-конец можно разнести на разные 
строки):

09:00 Выпуклый анализ
11:15                   112

12:00 Математика
14:45                   121

Хотя лично мне последний вариант с 
разнесение времени начала/конца на разные 
строки не очень нравится - ухудшается 
визуальное восприятие сетки на день 
(приходится усилием воли отделять строку с 
временем начала от сроки со временем конца, 
а до этого они были каждое в своем столбце).

Аудиторию в любом случае выравнивать по 
правому краю.

Original comment by bender...@gmail.com on 6 Dec 2010 at 3:39

GoogleCodeExporter commented 9 years ago
Vkurse_Android_v1.06.apk

Original comment by olga.tit...@gtempaccount.com on 12 Dec 2010 at 11:49

GoogleCodeExporter commented 9 years ago

Original comment by olga.tit...@gtempaccount.com on 12 Dec 2010 at 12:23