Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
igrok-vip
0 / 0 / 2
Регистрация: 22.04.2013
Сообщений: 125
1

ViewPager и ListView

07.05.2013, 20:15. Просмотров 2972. Ответов 6
Метки нет (Все метки)

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

Так как ViewPager использует фрагмент для отображения на экране, то пытаюсь во фрагменте в onCreateView в зависимости от номера страницы наполнять один и тот же ListView разным содержимым из базы данных при помощи SimpleCursorAdapter.

Редактирование происходит с помощью контекстного меню и DialogFragment'а. В диалоге при нажатии кнопки готово текст из EditText попадает в БД и обновляется курсор для SimpleCursorAdapter, что по сути должно привести к обновлению содержимого в ListView. Но после нажатия Готово в диалоге экран очищается и в эклипсе ошибка:
05-07 09:31:18.646: E/Cursor(1316): Invalid statement in fillWindow()
Если полистать ViewPager на пару страниц в сторону и вернуться назад, то данные обновляются.

Вот код как заполняю ListView

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
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
 
    View view = inflater.inflate(R.layout.activity_page_fragment, null);
    lvMain = (ListView) view.findViewById(R.id.lvMain);
    al = new ArrayList<String>();
    subj_id = new ArrayList<Integer>();
    group_id = new ArrayList<Integer>();
    stud_id = new ArrayList<Integer>();
 
    
 
    OnCreateContextMenuListener occm1 = new OnCreateContextMenuListener() {
 
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            // TODO Auto-generated method stub
            AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
            itemselected = aMenuInfo.position;
            id_itemselected = subj_id.get(itemselected);
            
            
            menu.add(Menu.NONE, M_EDIT1, Menu.NONE, "Изменить1");
            menu.add(Menu.NONE, M_DELETE, Menu.NONE, "Удалить1");
            menu.add(Menu.NONE, M_ADD, Menu.NONE, Integer.toString(aMenuInfo.position));
        }
        
    };
    
    OnCreateContextMenuListener occm2 = new OnCreateContextMenuListener() {
 
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            // TODO Auto-generated method stub
            AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
            itemselected = aMenuInfo.position;
            id_itemselected = group_id.get(itemselected);
            
            menu.add(Menu.NONE, M_EDIT2, Menu.NONE, "Изменить2");
            menu.add(Menu.NONE, M_DELETE, Menu.NONE, "Удалить2");
            menu.add(Menu.NONE, M_ADD, Menu.NONE, "Добавить2");
        }
        
    };
    
 
        
    
    switch (pageNumber){
    case 0: 
        DBase = new DataBase(getActivity());
        db = DBase.getWritableDatabase();
        c = db.query("subjects", null, null, null, null, null, null);
        int id_subj_ColIndex = c.getColumnIndex("_id");
        c.moveToFirst();
        subj_id.clear();
        do {
            subj_id.add(c.getInt(id_subj_ColIndex));
            } while (c.moveToNext() );
        c.moveToFirst();
        getActivity().startManagingCursor(c);
        String[] from = new String[] {"subject_name"};
        int[] to = new int[] {R.id.tvText};
        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, c, from, to);
        lvMain.setAdapter(scAdapter);
        //adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, al);
        //lvMain.setAdapter(adapter);
        lvMain.setOnCreateContextMenuListener(occm1);
        
        //registerForContextMenu(lvMain); 
        
        db.close();
        
        break;
        
    case 1:
        
        
        
    case 2:
        
        break;
    }
      
    return view;
  }
Вот как изменяю базу

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
public class dialog_edit extends DialogFragment implements OnClickListener {
 
      DataBase DBase;
      SQLiteDatabase db; 
      ContentValues cv;
      EditText ededit;
        
 
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
        getDialog().setTitle("Изменение записи");
        View v = inflater.inflate(R.layout.dialog_edit, null);
        v.findViewById(R.id.btnCancel).setOnClickListener(this);
        v.findViewById(R.id.btnApply).setOnClickListener(this);
        ededit = (EditText) v.findViewById(R.id.ededit);
        return v;
      }
 
      public void onClick(View v) {
        switch (v.getId()){
        case 
        R.id.btnCancel : 
            dismiss();
            break;
        case 
        R.id.btnApply :
            String text = ededit.getText().toString();
            cv = new ContentValues();
            cv.put("subject_name", text);
            DBase = new DataBase(getActivity());
            db = DBase.getWritableDatabase();
            int n_upd = db.update("subjects", cv, "_id = ?", new String [] {Integer.toString(PageFragment.id_itemselected)});
            db.close();
            PageFragment.c.requery();
            dismiss();
            break;
        }
        
      }
}
В чём проблема? Пытался то же самое сделать через обычный адаптер и при изменении данных в БД передавать в ListView адаптер по новой - был тот же результат.

Добавлено через 6 часов 20 минут
Вообщем это происходит из-за обновления курсора c.requery(). Неужели никак нельзя обновить данные в ListView во фрагменте?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 20:15
Ответы с готовыми решениями:

Обновление фрагмента с ListView в ViewPager
Есть класс фрагмента, который заполняет адаптер: public class PageFragment extends Fragment...

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

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

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

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

6
V0v1k
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.05.2013, 20:20 2
Цитата Сообщение от igrok-vip Посмотреть сообщение
. Неужели никак нельзя обновить данные в ListView во фрагменте?
Java
1
adapter.notifyDataSetChanged();
1
igrok-vip
0 / 0 / 2
Регистрация: 22.04.2013
Сообщений: 125
07.05.2013, 23:19  [ТС] 3
Это поставить после c.requery()? Не помогает. Как было так и осталось. Кстати сейчас заметил что после requery ListView просто исчезает, а TextView которая была под ListView поднимается наверх
0
V0v1k
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.05.2013, 23:48 4
выложите проект, так ничего не понятно.
подобное настораживает:
Java
1
PageFragment.c.requery();
0
igrok-vip
0 / 0 / 2
Регистрация: 22.04.2013
Сообщений: 125
08.05.2013, 12:05  [ТС] 5
Ну эта ерунда происходит не из-за этого PageFragment.c.requery(); А из-за самого requery. Пробовал его ставить просто в обработчик нажатий пунктов контекстного меню (просто c.requery(); ) - то же самое. Я просто базу изменяю в отдельном диалоговом окне для которого свой клас и после этого нужно вызвать PageFragment.c.requery();

Вот проект (почистил немного от лишнего хлама)
http://yadi.sk/d/oRW59ui84eEFO

Может у меня с самими фрагментами что-то напутано, но делал точно по уроку.
0
igrok-vip
0 / 0 / 2
Регистрация: 22.04.2013
Сообщений: 125
09.05.2013, 13:49  [ТС] 6
Ну как там? Не понятно из-за чего это? Кстати если запускать на 4.1 андроиде, то там просто не изменяются записи в ListView. А исчезает на 2.1
0
dimitriy951
2 / 2 / 1
Регистрация: 15.11.2013
Сообщений: 109
20.05.2015, 21:51 7
у меня вот так заработало
Java
1
2
3
 myadapter.notifyDataSetChanged();
        viewPager.setAdapter(myadapter);
        viewPager.setCurrentItem(1);
0
20.05.2015, 21:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2015, 21:51

ListView + ViewPager как правильнее организовать экспорт в Excel?
Здравствуйте! 1.) на каждой странице Pager'а свой список, как подготавливать данные (со всех...

Как победить подтормаживание при листании ViewPager со списками listview?
Как победить подтормаживание при листании ViewPager со списками listview? если быстро листать...

ViewPager
Помогите пожалуйста. Использую эту фичу в своей программе(пример один и его очень много в...


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

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

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