0

Здравствуйте.Имеется cursorloader в котором получаю из бд тв программу на текущее время.Жму на кнопку и создаю фрагмент с listview в ктором вызываю cursor loaderТ.к. данных много(500 каналов на неделю) данные появляются не сразу а через секунды 3(пустая форма потом данные).Пробовал к фрагменту прикрутить эффект задержки появления.Но все равно не то.Подскажите как показать фрагмент после загрузки данных?

Ivan
  • 556
  • 2
  • 14

2 Answers2

0

Сначала получите данные, в это время показывайте ProgressDialog, например. Поймайте момент, когда данные из БД будут получены полностью и только потом создавайте фрагмент и передавайте ему данные.

Или вы можете обернуть ListView и ProgressBar в FrameLayout. Пока данные считываются под списком будет крутиться кружок. Не забудьте скрывать его при загрузке данных

  • Так у меня несколько фрагментов поэтому я при во фрагменте oncreate запускаю cursorloader.как отловить? – Ivan Jan 16 '17 at 18:10
  • Переопределите метод onLoadFinished –  Jan 16 '17 at 18:13
  • Т.е. такое явление это нормально?у меня еще есть поиск каналов в бд так при вводе есть задержка видел программы у них тоже из бд посмотрел код ничего особенного так у гих почему то без задержки.может есть какой то фокус? – Ivan Jan 16 '17 at 18:20
  • Я с базой данной так масштабно не работал. Ответил на вопрос чисто "решением из гугла" и вовсе не из собственного опыта. Я думаю надо к БД обращаться через AsyncTask, а вообще я вроде где-то видел или слышал какую-то ОРМ (ORM) –  Jan 16 '17 at 18:25
  • AsyncTask проблемы думаю не решит. – Ivan Jan 16 '17 at 18:28
  • Старая но вроде надо почитать https://m.habrahabr.ru/post/125883/ –  Jan 16 '17 at 18:31
  • Читал это не то – Ivan Jan 16 '17 at 18:37
  • @Ivan а зачем вам поиск делать в самом бд? Не легче поиск делать уже в самом адаптере, когда список наполнился? – Iman Jan 16 '17 at 19:03
  • Гугл говорит что в адаптере cursoradapter такое не прокатит в отличие от baseadapter например.емли знаете способ скажите – Ivan Jan 16 '17 at 19:10
  • @Ivan а у вас список пополняется постоянно динамически, чтобы использовать cursorAdapter? Не легче сделать объект вашего канала и указать в объекте массив String передач. В том же CursorLoader при onLoadFinished заполнить массив с вашим объектом и передать его BaseAdapter так думаю будет легче идти процесс. – Iman Jan 16 '17 at 19:27
  • Хотел я то же создать baseadapter и например map《string list《program》》да че то при переборе тратится на заполнение много ресурсов.или вы как то по другому имели ввиду? – Ivan Jan 16 '17 at 19:32
  • @Ivan да, сейчас покажу в ответе – Iman Jan 16 '17 at 19:35
  • @Ivan я правильно вас понял, что вы хотите получить программу передач зайдя на определенный канал? Т.е. вы открываете в фрагменте какой то определенный канал и появляется программа? И вы в базе ищете программу по ID канала? – Iman Jan 16 '17 at 19:45
  • Я открываю фрагмент источник тв программ.допустим их 2.я жму на любой и загружаю список всех каналов в этом источнике на текущее время в новом фрагменте.там же емть окно для поиска которое и пенсионерит.промто есть программы эта же программа тв а поиск без тормозов. – Ivan Jan 16 '17 at 19:49
  • @Ivan т.е. у вас есть список каналов, и у каждого канала есть программа передач и поиск осуществляется и по каналам и по программе передач? – Iman Jan 16 '17 at 19:54
  • В бд есть таблица программа с полями имя канала программы описание начало конец и т.д.сейчас у меня поиск только по имени еще буду делать и по тередачи. – Ivan Jan 16 '17 at 19:56
  • @Ivan CursorLoader уже работает в асинхронном потоке и AsyncTask будет совершенно лишним, вы правы.. Фильтр по БД с CursorLoader, может поможет. Вообще нужен код, как вы запросы делаете и тд. Выборка 500 записей не может вешать данные на 3 секунды. – pavlofff Jan 17 '17 at 05:06
  • Задержка та есть.Просто там запрос сложный из нескольких таблиц – Ivan Jan 17 '17 at 05:22
0

Например создаете класс itemTv

public class itemTv {

    private int _id;
    private String titleTv;
    private String programsTv;

    public itemTv(int _id, String titleTv, String programsTv){
        super();
        this._id = _id;
        this.titleTv = titleTv;
        this.programsTv = programsTv;
    }

    public int get_id() {
        return _id;
    }

    public String getTitleTv() {
        return titleTv;
    }

    public String getProgramsTv() {
        return programsTv;
    }
}

Потом при onLoadFinished:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    if (data != null && data.moveToFirst()){
        List<itemTv> programs = new ArrayList<>();

        for (int i=0; i < data.getCount(); i++){
            programs.add(new itemTv(
                id,
                title,
                programs
            ));
        }

        //Я честно говоря не понял какая у вас схема база данных и как вы обращаетесь к базе чтобы получить каналы, а также получить программу передач отдельного канала, но думаю вы схему поняли, определяете Item вашего канала как вы желаете, дальше делаете массив List<с вашим item> и заполняете его в onLoadFinished и отправляете в BaseAdapter где вы требуете List<с вашим item>
    }
}
Iman
  • 591
  • А так память жрать не будет?в таблице программа емть поле name и в таблице channel есть name вот из channel join да where pr.name=ch.name значит канал наш а так же та еще проверка на текущее время.в общем проверок полно. – Ivan Jan 16 '17 at 20:13
  • @Ivan память жрать не будет, ибо вы уже все подгрузили, здесь просто ваш список обрабатывается, да и легче уже потом этим списком управлять, поиск и т.д. Тогда вам нужно 2 itemа сделать, 1 просто для меню, т.е. отображения списка каналов, другой уже список программ для канала. – Iman Jan 16 '17 at 20:20
  • В epg прогоамме не сильны? – Ivan Jan 16 '17 at 21:04
  • Каким образом дополнительная промежуточная перегонка в коллекцию после выборки из БД ускорит отображение данных? – pavlofff Jan 17 '17 at 05:01
  • @pavlofff А что ускорит? – Ivan Jan 17 '17 at 05:23
  • @Ivan не имея вашего кода могу сказать, что ускорит оптимизация запроса, наверное или что то другое, может быть .. – pavlofff Jan 17 '17 at 05:25