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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 118
#1

ViewPager и ListView - Программирование Android

07.05.2013, 20:15. Просмотров 2543. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 20:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ViewPager и ListView (Программирование Android):

Обновление фрагмента с ListView в ViewPager - Программирование Android
Есть класс фрагмента, который заполняет адаптер: public class PageFragment extends Fragment implements LoaderCallbacks&lt;Cursor&gt; { ...

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

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

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

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

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

6
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.05.2013, 20:20 #2
Цитата Сообщение от igrok-vip Посмотреть сообщение
. Неужели никак нельзя обновить данные в ListView во фрагменте?
Java
1
adapter.notifyDataSetChanged();
1
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 118
07.05.2013, 23:19  [ТС] #3
Это поставить после c.requery()? Не помогает. Как было так и осталось. Кстати сейчас заметил что после requery ListView просто исчезает, а TextView которая была под ListView поднимается наверх
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.05.2013, 23:48 #4
выложите проект, так ничего не понятно.
подобное настораживает:
Java
1
PageFragment.c.requery();
0
igrok-vip
0 / 0 / 3
Регистрация: 22.04.2013
Сообщений: 118
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 / 3
Регистрация: 22.04.2013
Сообщений: 118
09.05.2013, 13:49  [ТС] #6
Ну как там? Не понятно из-за чего это? Кстати если запускать на 4.1 андроиде, то там просто не изменяются записи в ListView. А исчезает на 2.1
0
dimitriy951
2 / 2 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2015, 21:51
Привет! Вот еще темы с ответами:

Как победить подтормаживание при листании ViewPager со списками listview? - Программирование Android
Как победить подтормаживание при листании ViewPager со списками listview? если быстро листать (ну или даже не очень быстро), то...

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

ViewPager - Программирование Android
Всем. Да я недалекий и тупой, уже дня три не могу никак понять :wall: Есть ViewPager &lt;android.support.v4.view.ViewPager ...

ViewPager - Программирование Android
Здравствуйте! В приложении использовал пример с Хабра http://habrahabr.ru/post/131889/, однако, не могу понять как при прокрутке экранов...


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

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

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