Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 06 мар 2015, 14:58

public Cursor getCity_CTO(String test)
R.id.team

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

LLIPAM
Сообщения: 24
Зарегистрирован: 11 фев 2015, 06:55

Re: Урок 136. CursorLoader

Сообщение LLIPAM » 06 мар 2015, 16:10

Извеняюсь за вопрос сам разобрался =)

Cliffman
Сообщения: 8
Зарегистрирован: 05 мар 2015, 16:12

Re: Урок 136. CursorLoader

Сообщение Cliffman » 13 мар 2015, 14:19

с горем пополам разобрался с cursorAdspter, но возник вопрос по кастомизации адаптера

мой item.xml

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="50dp">

    <TextView
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:id="@+id/li_t_picket"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:text="@string/st_picket" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:text="New Text"
        android:id="@+id/li_t_XY"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/li_t_picket"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/li_t_length"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/li_t_picket"
        android:layout_below="@+id/li_t_XY"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />


</RelativeLayout>
в li_t_XY надо вьівести строку формата "X="+DB.COLUMN_X+" Y="+DB.COLUMN_Y

киньте чето почитать, ибо ниче сам не нашел(

Stannm
Сообщения: 6
Зарегистрирован: 24 мар 2015, 15:12

Re: Урок 136. CursorLoader

Сообщение Stannm » 31 мар 2015, 14:31

Добрый день.
Подскажите, пожалуйста, а если мне нужно получить данные с сервера, запись в локальную sqllite и отобразить с возможностью группировки, сортировки и поиска, использовать cursor loader или кастомный адаптер писать и поместить загрузку/отображение данных в поток?

shaman.nk
Сообщения: 1
Зарегистрирован: 13 май 2015, 16:54

Re: Урок 136. CursorLoader

Сообщение shaman.nk » 13 май 2015, 17:05

Может уже задавали вопрос, не нашел ответа. Как сделать два ListView только с разными запросами в бд?
Не понял в какой момент можно врезаться. Сделал новую процедуру запроса но где его использовать (Создавать новый адаптер или как то можно наложить условие и выполнять свою процедуру). Если можно с примером буду благодарен.

porodem
Сообщения: 3
Зарегистрирован: 24 янв 2014, 15:15

Re: Урок 136. CursorLoader

Сообщение porodem » 13 май 2015, 17:45

Прошу вашей помощи, уважаемые. У меня жёсткий ступор на этом уроке. Ругается в одном месте:

Изображение

Не могу понять, почему ему этот this не нравится?

Класс у меня объявляется так

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

public class MainActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks<Cursor> {
Класс MyCursorLoader

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

static class MyCursorLoader extends CursorLoader {

        DB db;

        public MyCursorLoader(Context context, DB db){
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getAllData();
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return cursor;
        }

    }
Доп.вопрос, почему (замечаю очень часто) вместо LoaderCallbacks, как указанно в примере, меня программа заставляет вставить LoaderManager.LoaderCallbacks ?

Искренне жду помощи.

omk
Сообщения: 2
Зарегистрирован: 05 мар 2015, 19:49

Re: Урок 136. CursorLoader

Сообщение omk » 28 май 2015, 10:35

Есть два Activity. В 1-м выводятся данные из БД, во 2-м создается новый поток AsyncTask, в котором выполняется загрузка данных и добавление их в БД.
Если загрузка и добавление данных выполнились до закрытия 2-й Activity, то в 1-й отображаемый список обновляется.
Если загрузка и добавление данных не завершились до закрытия 2-й Activity, то в 1-й соответственно список не обновляется.

Как и когда уведомить 1-ю Activity, что загрузка выполнилась и надо обновить список?

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 28 май 2015, 11:38

1) использовать контент-провайдеры
2) не использовать асинктаск
R.id.team

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

Light310
Сообщения: 6
Зарегистрирован: 13 июн 2015, 00:59

Re: Урок 136. CursorLoader

Сообщение Light310 » 18 июн 2015, 00:25

Доброй ночи, товарищи.
Прошерстил множество примеров, так и не нашёл решения. Очень надеюсь на вашу помощь.
Предположим, что рассматриваем приложение ровно как в уроке, но с EditText вместо TextView. Как получить доступ к этим EditText'ам и повесить на них TextWatcher'ы? Прописать android:onClick в xml (как для кнопок) нельзя, надо присваивать обработчики программно, так вот в каком месте и в каком виде это можно сделать? По возможности прошу рабочий пример или кусок кода, потому что именно с CursorLoader'ом я ни одного рабочего примера не нашёл...
Спасибо.

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 18 июн 2015, 08:59

вероятно, ты начал с 136 урока, а надо было сначала почитать
Вся эта элементарщина есть в первых уроках.
R.id.team

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

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 136. CursorLoader

Сообщение K_Vladimir » 09 июл 2015, 14:26

У меня такая же ошибка на this. Вы решили эту проблему?
getSupportLoaderManager().initLoader(0, null, this);

Error:(59, 34) error: method initLoader in class LoaderManager cannot be applied to given types;
required: int,Bundle,LoaderCallbacks<D>
found: int,<null>,MainActivity
reason: cannot infer type-variable(s) D
(argument mismatch; MainActivity cannot be converted to LoaderCallbacks<D>)
where D is a type-variable:
D extends Object declared in method <D>initLoader(int,Bundle,LoaderCallbacks<D>)

Очень прошу помощи.

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 136. CursorLoader

Сообщение K_Vladimir » 09 июл 2015, 15:01

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

А где текстовая версия урока? Или её вообще нет?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 136. CursorLoader

Сообщение klblk » 09 июл 2015, 15:04

K_Vladimir писал(а):Кажется проблема была в импорте.
К сожалению, в видео уроке импорт был скрыт.
Из-за этого пол дня пришлось разбираться.

А где текстовая версия урока? Или её вообще нет?
Первое сообщение в теме->ссылка

dimich
Сообщения: 14
Зарегистрирован: 17 июл 2013, 16:13

Re: Урок 136. CursorLoader

Сообщение dimich » 18 июл 2015, 23:31

Если использовать версию API = 17, то выдает ошибку

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

E/SQLiteLog﹕ (1) no such table: mytab
Лечится переименовыванием БД из "mydb" в "mydb.db"

Мучался три дня :)

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 19 июл 2015, 15:54

базу можно как угодно,ошибка наверняка была в другом
R.id.team

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

92sandeor
Сообщения: 2
Зарегистрирован: 07 апр 2015, 20:36

Re: Урок 136. CursorLoader

Сообщение 92sandeor » 20 июл 2015, 23:37

Философский вопрос! Читал честно и много из этой темы, но не всё, простите, если уже спрашивали.
Я понимаю, что SimpleCursorAdapter и всё остальное - устарело, но почему нельзя его использовать?
Если я правильно понял, то в документации написано, что проблема в том, что в старом методе всё
исполняется в главном потоке, и от этого все может повиснуть и приложение может не отвечать.
Тогда же можно просто создать отдельный поток и не мучаться со всеми лоадерами и всем остальным.
Или главная проблема в том, что за каждый проигнореный варнинг добавляется сто лет горения в аду?О_О

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 21 июл 2015, 12:18

Адаптер это адаптер, а лоадер - это лоадер, это разные вещи и выполняют разную функцию. Лоадер доставляет данные в адаптер асинхронно, да - это нужно делать в отдельном потоке. Дело в том, что для новичка согласовать поток и активити - не так-то и просто, там куча всяких моментов, связанных с жизненным циклом активити. И на самом деле лоадеры - это не сложный паттерн, реализация нескольких несложных методов, которые на второй раз уже не задумываясь реализовываешь и не имеешь головной боли, так как лоадеры привязаны к жизненному циклу активити.
Я вообще не советую новичкам выдумывать что-то свое. Научитесь делать так, как говорит гугл, а потом уже, когда будете плавать в этом свободно - делайте что считаете нужным.
"просто создать отдельный поток" :shock:
Изображение
R.id.team

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

СергейC
Сообщения: 1
Зарегистрирован: 09 сен 2015, 01:13

Re: Урок 136. CursorLoader

Сообщение СергейC » 09 сен 2015, 01:21

Если во время работы лодера перевернуть устройство, то программа вылетает с ошибкой. видимо из за того активити повторно открывается. Посоветуйте как обойти эту ошибку?
Так же ошибка вылетает если запустить программу в одной ориентации, потом перевернуть устройство и нажать кнопку "добавить запись". Или любое другое действие с данными.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 136. CursorLoader

Сообщение Mikhail_dev » 09 сен 2015, 09:21

Сергей, научитесь сначала приводить логи с ошибкой. Буд то здесь всевидящие сидят, которые знают какая именно ошибка у вас.
Посмотрите этот вебинар, про LogCat
viewtopic.php?f=60&t=3198

niklas1987
Сообщения: 3
Зарегистрирован: 06 мар 2015, 22:41

Re: Урок 136. CursorLoader

Сообщение niklas1987 » 10 сен 2015, 00:19

Драсьте! Никак не получается обновить ListView во Fragment После удаления item.
После перехода из Активити добавления записи все обновляется через

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

@Override
    public void onResume(){
        super.onResume();
        getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
    }
А вот после удаления, приходится листать фрагменты чтобы удаленное содержимое пропало. Че не понял, че пропустил. Подскажите пожалуйста!

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

public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.deleteRow(acmi.id);
            // получаем новый курсор с данными
            getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
            return true;
        }
Вот весь код!
some fragment

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

package comzaqxs.vk.com.fucktheorientation.Fragments;

import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;

import comzaqxs.vk.com.fucktheorientation.DBAdapter;
import comzaqxs.vk.com.fucktheorientation.R;

/**
 * Created by Николай on 27.08.2015.
 */
public class MonthFragment extends Fragment implements LoaderCallbacks<Cursor> {

    public static final String[] months = {"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};
    public static final String[] years = {"2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030"};
    private static final int CM_DELETE_ID = 1;
    ListView lvMonth;
    DBAdapter db;
    SimpleCursorAdapter scAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.month_item, container, false);

        db = new DBAdapter(getActivity());
        db.open();
        String[] fromFieldNames = new String[]{DBAdapter.KEY_DATE, DBAdapter.KEY_AREA, DBAdapter.KEY_PASSENGER};
        int[] toViewsID = new int[]{R.id.tvItemDate, R.id.tvItemArea, R.id.tvItemPassenger};
        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, fromFieldNames, toViewsID, 0);

        lvMonth = (ListView)v.findViewById(R.id.lvMonth);
        lvMonth.setAdapter(scAdapter);
        lvMonth.setBackgroundColor(0xffFFFFFF);
        registerForContextMenu(lvMonth);
        getActivity().getSupportLoaderManager().initLoader(0, null, this);

        Spinner monthsSpinner = (Spinner)v.findViewById(R.id.monthSpinner);
        monthsSpinner.setBackgroundColor(0xffF44336);
        ArrayAdapter<String> monthsAdapter = new ArrayAdapter<>(getActivity(), R.layout.my_spinner_gravity_center, months);
        monthsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        monthsSpinner.setAdapter(monthsAdapter);

        monthsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                // показываем позиция нажатого элемента МЕСЯЦ
                //Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });

        Spinner yearSpinner = (Spinner)v.findViewById(R.id.yearSpinner);
        yearSpinner.setBackgroundColor(0xffF44336);
        ArrayAdapter<String> yearAdapter = new ArrayAdapter<>(getActivity(), R.layout.my_spinner_gravity_center, years);
        yearAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        yearSpinner.setAdapter(yearAdapter);

        yearSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                // показываем позиция нажатого элемента МЕСЯЦ
                //Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });

        return v;
    }

    @Override
    public void onResume(){
        super.onResume();
        getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
    }

    public void onDestroy() {
        super.onDestroy();
        db.close();
    }

    public static MonthFragment newInstance() {

        return new MonthFragment();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(getActivity(),    db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        scAdapter.swapCursor(data);
    }


    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    }

    static class MyCursorLoader extends CursorLoader {

        DBAdapter db;

        public MyCursorLoader(Context context, DBAdapter db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            return db.getMonthRows();
        }

    }

    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }

    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.deleteRow(acmi.id);
            // получаем новый курсор с данными
            getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
            return true;
        }
        return super.onContextItemSelected(item);
    }
}

Ответить