Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
#1

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

11.08.2014, 15:03. Просмотров 1381. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2014, 15:03     Обновление фрагмента с ListView в ViewPager
Посмотрите здесь:

Android ViewPager и ListView
Обновление содержимого ViewPager Android
Android ViewPager внутри ListView, Как вставить?
Android Обновление ListView
Android Обновление ListView
Скроллинг ViewPager-а как у ListView Android
Android Периодическое обновление ListView
Android Задать позицию ListView в ViewPager
ListView обновление Android
Как победить подтормаживание при листании ViewPager со списками listview? Android
Android Обновление listview
Android Повторное создание фрагмента внутри фрагмента ViewPager

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
12.08.2014, 06:49     Обновление фрагмента с ListView в ViewPager #2
вот то что вам нужно)

http://www.mysamplecode.com/2011/09/...was-never.html
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
12.08.2014, 08:37  [ТС]     Обновление фрагмента с ListView в ViewPager #3
KillAndEat, это и так стоит в классе БД
Java
1
2
3
4
5
public void close() {
 if (mDbHelper != null) {
  mDbHelper.close();
 }
}
В принципе некритично, приложение не падает.
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
12.08.2014, 18:46     Обновление фрагмента с ListView в ViewPager #4
создайте экземпляр базы на фрагмент выше, а сюда просто передавайте его. Закрываете после того как убираете его с экрана. При листании ViewPager'a на 2 и больше элементов, первые удаляются и база может закрываться, хотя странно что просто с ошибкой не вывалилось у вас
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
13.08.2014, 09:23  [ТС]     Обновление фрагмента с ListView в ViewPager #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 зашита, поэтому.
Yandex
Объявления
13.08.2014, 09:23     Обновление фрагмента с ListView в ViewPager
Ответ Создать тему
Опции темы

Текущее время: 16:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru