Урок 54. Кастомизация списка. Создаем свой адаптер

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 16:21

Если всё таки не получится то следующий шаг будет верным - попробуйте сериализовать ResultSet. Посмотрел по сериализации достаточно примеров, так что проблем не должно возникнуть.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 22:30

Сделала в точности по уроку, но запустить не могу, у меня почему-то компилятор просит убрать все override из класса boxAdapter. Над каждым методом пишет, что он must override метод суперкласса, а в решении говорит - давайте сделаем ему "remove @override anotation"
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreyI » 25 окт 2012, 01:00

Зайдите в Project->Properties->Java Compiler справа поставьте Compiler compliance level - 1.6,более старые версии JAVA не поддерживают аннотацию @Override

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 25 окт 2012, 11:30

ох, я так и сделала еще вчера, но если кому-то пригодится.. ничего у меня не исчезло, переключала эти версии, и хотя проект перекомпилировался - это не помогло. Несколько раз закрывала открывала эклипс, потом еще пару раз после переделок туда и обратно сделала проекту Clean, и только потом оно заработало!
А не подскажите, чтобы не рыться, а то голова уже пухнет - почему оно у меня теперь на перестановку версии на 1.7 ругается, говорит, что он мне не подоходит? (хотя один раз самый первый мне удалось на нее проект переключить). И вообще что означают эти версии, какая лучше и зачем оно было установлено в 1.5 по умолчанию? или это я где-то ее установила сама? Это зависит, наверное, от target version джавы приложения, указанной в манифесте?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreyI » 25 окт 2012, 18:55

Ну вы же на JAVA кодите в Android, поэтому нет ничего удивительного, что для компиляции, компоновки используются инструменты JDK.
Если ругается на 1.7 - на папке проекта (в Package Explorer) кликните правой кнопкой мыши выберите Android Tools->Fix Project Properties

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 25 окт 2012, 19:19

а 1.7 это лучше? я про то, что не знаю надо оно мне или нет..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreyI » 25 окт 2012, 19:40

Вообще для Android достаточно минимум 1.5 если не ошибаюсь, единственное накладки бывают появляются с аннотациями, которые с каждой новой версией JDK только расширяют, но основных языковых возможностей вполне достаточно. Кстати у меня нет проблем с @Override, хотя в проектах стоит 1.5, может в ADT21, которой я пользуюсь, как-то это учли.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 27 окт 2012, 06:38

Здравствуйте,

Ну вроде все получилось. Приложение, которое я попытался реализовать, используя пример из этого урока, работает. Есть только одно но: отмеченные чекбоксы в ChildActivity при возвращении обратно не отображаются. Понимаю почему это происходит, поэтому попытался сделать следующее:
Создал методы:

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

   public CheckBox checkboxer() {
        final CheckBox box = (CheckBox) findViewById(R.id.cbBox);
        Log.d(LOG_TAG, "make ListView clickable");
        lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                box.setChecked(true);
            }
        });
        return box;
    }

   private void savebox(final boolean isChecked) {
        SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("check", isChecked);
        editor.commit();
        Log.d(LOG_TAG, "checkbox is saved");
    }

    private boolean load() {
        SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
        return sharedPreferences.getBoolean("check", false);
    }
при вызове onPause() чекнутые значения сохраняются при помощи SharedPreferences

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

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "ChildActivity: onPause()");
        // закрываем подключение к БД
        DataSourceChild.closeChild();
        savebox(checkboxer().isChecked());
}
а при вызове onResume должны загружаться.

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

   protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "ChildActivity: onResume()");
        // открываем подключение к БД
        DataSourceChild.openToWriteChild();
  
          checkboxer().setChecked(load());         
    }
но этого не происходит, при вызове onResume приложение вылетает. Решил, что это из-за того, что еще нет отмеченных чекбоксов и сохраненных данных, однако даже при использовании savebox в onResume, результат такой же.

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

Спасибо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 27 окт 2012, 11:38

Когда ж вы научитесь предоставлять лог ошибок. У меня отсутствуют экстрасенсорные навыки, но осмелюсь предположить что ошибка NullpointerException.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 27 окт 2012, 13:27

О, простите.

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

08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime  FATAL EXCEPTION: main
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime  java.lang.RuntimeException: Unable to resume activity {example.CustomAdapter/example.CustomAdapter.ChildActivity}: java.lang.NullPointerException
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:99)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.os.Looper.loop(Looper.java:123)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:3683)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:507)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime  Caused by: java.lang.NullPointerException
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at example.CustomAdapter.ChildActivity.onResume[color=#FF0000](ChildActivity.java:256)[/color]
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.Activity.performResume(Activity.java:3832)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
08:18:37.830    1773    example.CustomAdapter   ERROR   AndroidRuntime      ... 12 more

256-я строка, как раз и есть checkboxer().setChecked(load()); в onResume.

Спасибо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 27 окт 2012, 13:40

я всё таки обладаю экстрасенсорными навыками :D о чём я и говорил NullPointerException

Теперь моё следующее предсказание: приложение падает вот на этой строке
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener()
Так как осмелю предположить в момент onResume() лист lvMain ещё не определён.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 27 окт 2012, 14:11

Правильно. Что делать в этом случае?

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 27 окт 2012, 14:14

Предвидя, создал отдельный метод

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

    public void loader(int val) {

        item_values = child_datasource.readItem(val);

        // определяем адаптер
        boxAdapter = new BoxAdapter(this, item_values);

        // настраиваем список
        lvMain = (ListView) findViewById(R.id.lvMain);

        // выставляем адаптер
        lvMain.setAdapter(boxAdapter);

        // регистратор контекстного меню
        registerForContextMenu(lvMain);

        // делаем список кликабл
        lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                box = (CheckBox) view.findViewById(R.id.cbBox);
                box.setChecked(true);

                // уведомляем, что данные изменились
                boxAdapter.notifyDataSetChanged();
            }
        });

        boxAdapter.notifyDataSetChanged();
    }

который загружается в onCreate.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 27 окт 2012, 14:14

Извините, что его загружать и в onResume?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 27 окт 2012, 17:10

Здравствуйте!
помогите, пожалуйста,в следующем. Создала адаптер на основе SimplecuursorAdapter с тем, чтобы попробовать выделять строчки курсора. Теперь вот хочу раскрашивать строчки в зависимости от данных в таблице (т.е. от данных в курсоре, "связанном" с listview).
Я так поняла, что нужно внести изменнеия в метод getView, правильно?
Но я не пойму, как из этого метода "добраться", обратиться к соответствующей строчке в курсоре.

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
		...
	}
Я вижу, что сюда передается позиция, но как использовать ее, чтоб понять, в какую строку курсора мне обратиться?
Большое спасибо.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 27 окт 2012, 18:54

dil_android, внимательно ещё раз посмотрите на LifeCycle активити. Второй раз добавлять не нужно, просто метод loader запускайте в onResume().
R.id.team
Политика на форуме запрещена

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 27 окт 2012, 21:39

Olivka
данные нужно вносить в bindView, так как именно в этом методе вы получаете данные.

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

@Override
	public void bindView(View view, Context _context, Cursor _cursor) {
		String title = _cursor.getString(_cursor.getColumnIndex(AppData.COLUMN_TITLE));
		Double price = Double.parseDouble(_cursor.getString(_cursor.getColumnIndex(AppData.COLUMN_PRICE)));
		TextView titleTV = (TextView) view.findViewById(R.id.titleTV);
		TextView priceTV = (TextView) view.findViewById(R.id.priceTV);
		titleTV.setText(title);
		priceTV.setText(price.toString() + "$");
	}
Вот вам курсор в методе, с него вытаскиваете данные. Вытаскиваете вьюхи и делайте с ними что хотите.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 27 окт 2012, 22:30

Так меня смутило то, что этот метод bindView же вызывается автоматом?
а я жать хочу на элементы списка
Но я уже нашла, это делаетс ятам так

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

View v = super.getView(position, convertView, parent);
Cursor c = getCursor();
		c.moveToPosition(position);
		int col = c.getColumnIndex("chk");
и так далее

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

v.setBackgroundColor(Color.GREEN);
Подскажите, пожалуйста, как цвет выбрать такой как я хочу, а то я пытаюсь цвет выставить а там только свойства Color.GREEN допустим.. в общем, очень ограниченный набор, а я хочу зеленый не такого оттенка..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 27 окт 2012, 22:34

rezak90
Я бы вам медаль дала за стойкость, спасибо :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 27 окт 2012, 23:48

Olivka
res-values-color (если нет файла color.xml то создайте его) и там прописывайте цвета в RGB стиле (например: #000000 - чёрный если не ошибаюсь).
R.id.team
Политика на форуме запрещена

Ответить