Closed GoogleCodeExporter closed 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
На первый взгляд выглядит нормально.
Зачекинь текущую версию в svn.
Original comment by bender...@gmail.com
on 3 Dec 2010 at 11:25
Выложила
Original comment by olga.tit...@gtempaccount.com
on 3 Dec 2010 at 12:10
> 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
Vkurse_Android_v1.04.apk
Только, по-моему, формат расписания
название предмета
время аудитория
гораздо удобнее. Его я и реализовала.
Original comment by olga.tit...@gtempaccount.com
on 6 Dec 2010 at 1:13
Спасибо, все работает.
>Только, по-моему, формат расписания
Мне кажется, что отводить только половину
экрана на название предмета все-таки не
очень хорошо - если название будет
достаточно длинным (конечно всегда можно
вбить название такой длинны, что поплывет
любой лэйаут, но в текущей реализации он
поплывет гораздо раньше).
Если хочется сакцентировать внимание на
времени, лучше или написать его крупным
шрифтом (а шрифт с названием предмета еще
уменьшить), или поменять местами время и
номер аудитории (время перенести вправо,
выделение крупным шрифтом можно все равно
использовать):
Выпуклый анализ
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
Vkurse_Android_v1.06.apk
Original comment by olga.tit...@gtempaccount.com
on 12 Dec 2010 at 11:49
Original comment by olga.tit...@gtempaccount.com
on 12 Dec 2010 at 12:23
Original issue reported on code.google.com by
bender...@gmail.com
on 1 Dec 2010 at 12:30