Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
1

Обновление фрагмента с ListView в ViewPager

11.08.2014, 15:03. Просмотров 1551. Ответов 4
Метки нет (Все метки)

Есть класс фрагмента, который заполняет адаптер:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
public class PageFragment extends Fragment implements LoaderCallbacks<Cursor> {
    private static final int ADD_REMOVE_FAVORITE = 1;
    static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";
    static ListView listView;
    int pageNumber;
    public DB db;
    SimpleCursorAdapter scAdapter;
    Cursor cursor;
 
    static PageFragment newInstance(int page) {
        PageFragment pageFragment = new PageFragment();
        Bundle arguments = new Bundle();
        arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
        pageFragment.setArguments(arguments);
        return pageFragment;
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {        
        View view = inflater.inflate(R.layout.fragment, null);      
        String[] from = new String[] { DB.COLUMN_RES_NAME };
        int[] to = new int[] { R.id.tvText1 };      
        db = new DB(this.getActivity());
        db.open();      
        cursor = db.getData(pageNumber);        
        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, cursor, from, to, 0);
        listView = (ListView) view.findViewById(R.id.listView1);
        listView.setAdapter(scAdapter);     
        registerForContextMenu(listView);
        return view;
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);       
        AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;        
        menu.add(0, ADD_REMOVE_FAVORITE, 0, 
            (db.getFav(acmi.id) == 0 ? R.string.add_to_favorite : R.string.remove_from_favorite));
    }   
    
    public boolean onContextItemSelected(MenuItem item) {     
        if (item.getItemId() == ADD_REMOVE_FAVORITE) {
          AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
// проверка записи на избранное
          int i = item.getTitle().equals(getString(R.string.add_to_favorite)) ? 1 : 0;       
          db.addRemoveFromFavorite(acmi.id, i);  // добавить/удалить из БД  
          cursor = db.getData(pageNumber); // получить записи из БД
          scAdapter.changeCursor(cursor);   
          scAdapter.notifyDataSetChanged(); // не срабатывает если листаю на + 2 страницы    
          return true;
        }
        return super.onContextItemSelected(item);
      }
    
    public void onDestroy() {       
        db.close();
        super.onDestroy();
    }
 
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(getActivity(), db);
    }
 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }
 
    public void onLoaderReset(Loader<Cursor> loader) {
    }
 
    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();
            } finally {
                this.db.close();
            }
            return cursor;
        }
    }
}

Проблема в обновлении записей (метод onContextItemSelected).
Первая страница в ViewPager - Избранное. Когда я добавляю запись из второй страницы через контекстное меню, листаю влево (на избранное) - запись появилась. Удаляю из избранного (через контекстное меню) - запись исчезла.
Но стоит добавить в избранное запись с третьей страницы (она тоже появится в избранном, тут все норм), то теперь при удалении - ListView не обновляется.
Подозрение на public DB db, может его в каждом методе open/close делать?

Добавлено через 15 часов 55 минут
Вобщем выкинул 2 строки и все заработало, а то уже register DataSetObserver начал изучать))
Java
1
2
// scAdapter.notifyDataSetChanged();
// return true;
Может кто еще подскажет про ошибку?
SQLiteDatabase
close() was never explicitly called on database
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2014, 15:03
Ответы с готовыми решениями:

Повторное создание фрагмента внутри фрагмента ViewPager
Доброго времени суток! Использую внутри фрагмента элемент ViewPager, который...

ViewPager и ListView
Вообще пытаюсь сделать пролистывающиеся редактируемые списки. Для этого...

Скроллинг ViewPager-а как у ListView
Как сделать скроллинг у ViewPager-а по несколько элементов сразу, в зависимости...

Задать позицию ListView в ViewPager
Добрый вечер! Столкнулся с проблемой обновления ListView, после нажатия на...

Ошибка при инициализации ListView в ViewPager
Всем доброго времени суток. Столкнулся с проблемой, в простом примере создания...

4
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.08.2014, 06:49 2
вот то что вам нужно)

http://www.mysamplecode.com/2011/09/...was-never.html
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
12.08.2014, 08:37  [ТС] 3
KillAndEat, это и так стоит в классе БД
Java
1
2
3
4
5
public void close() {
 if (mDbHelper != null) {
  mDbHelper.close();
 }
}
В принципе некритично, приложение не падает.
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
12.08.2014, 18:46 4
создайте экземпляр базы на фрагмент выше, а сюда просто передавайте его. Закрываете после того как убираете его с экрана. При листании ViewPager'a на 2 и больше элементов, первые удаляются и база может закрываться, хотя странно что просто с ошибкой не вывалилось у вас
1
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
13.08.2014, 09:23  [ТС] 5
NiRamz, попробую.
Кликните здесь для просмотра всего текста
E/SQLiteDatabase(526): close() was never explicitly called on database '/data/data/ru.myapp.viewpager/databases/db.db'
E/SQLiteDatabase(526): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
E/SQLiteDatabase(526): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
E/SQLiteDatabase(526): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
E/SQLiteDatabase(526): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
А видимо ошибка в catch зашита, поэтому.
0
13.08.2014, 09:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2014, 09:23

ViewPager внутри ListView, Как вставить?
Здравствуйте. Есть задача, внутри ListView сделать айтемы, которые содержат...

Динамическое обновление ViewPager
Есть ViewPager, который заполняется из БД. При удалении удаляется запись из БД,...

Обновление содержимого ViewPager
Есть ли какие-нибудь способы обновить содержимое всех страницы ViewPager'а?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru