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

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

Войти
Регистрация
Восстановить пароль
 
Nakiii
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 80
#1

Обновление данных в ViewPager при перелистывании вкладок - Программирование Android

09.05.2017, 18:01. Просмотров 298. Ответов 6
Метки нет (Все метки)

Есть две вкладки (смотри картинку).
На первой нажимаем кнопку плюс - пишем имя - сохраняю item.
Теперь, при перелистывании этот Item должен появиться во втором фрагменте, но его там нет.
Как мне обновить фрагмент при перелистывании?

Код АДАПТЕРА
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
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
 
import com.example.evgeny.myApp.fragments.ContentFragment;
import com.example.evgeny.myApp.fragments.SavedListsFragment;
 
public class TabsPagerFragmentAdapter extends FragmentStatePagerAdapter {
    private String[] tabs;
 
    public TabsPagerFragmentAdapter(FragmentManager fm) {
        super(fm);
        tabs = new String[]{"Главная", "Сохраненные"};  //Пункты TabLayout
    }
 
    @Override
    public CharSequence getPageTitle(int position) {
        return tabs[position];  //Получаю название выделеной вкладки
    }
 
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new ContentFragment();
            case 1:
                return new SavedListsFragment();
        }
        return null;
    }
 
    @Override
    public int getCount() {
        return tabs.length;
    }
}
Код ФРАГМЕНТА
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
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
 
import com.example.evgeny.myApp.DBHelper;
import com.example.evgeny.myApp.MainActivity;
import com.example.evgeny.myApp.R;
 
import static com.example.evgeny.myApp.DBHelper.LISTS_TABLE_NAME;
 
public class SavedListsFragment extends Fragment implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {
 
    /*-------Переменные для поиска id-------*/
    ListView lvLists;
 
 
    /*---Переменные с пояснение---*/
    DBHelper dbHelper;
    SQLiteDatabase database;
    Cursor cursor;
    SimpleCursorAdapter sCursorAdapter;
    static String itemName;                 //Сюда сохраняю имя пункта lvLists по которому было выполнено длительное нажатие
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_saved_lists, container, false);
        Log.v(MainActivity.TAG, "onCreateView SavedListsFragment");
 
        /*Поиск вьюшек по ID*/
        lvLists = (ListView) v.findViewById(R.id.lvLists);
 
 
        /*Присвоение обработчиков компонентам*/
        lvLists.setOnItemClickListener(this);       //Повесил обработчик быстрого нажатия пунктов lvLists
        lvLists.setOnItemLongClickListener(this);   //Повесил обработчик длительного нажатия пунктов lvLists
 
 
        readTableLists();   //Чтение и вывод всех списков в боковое меню
 
 
        return v;
    }
 
    //Чтение и вывод всех имеющихся списков
    public void readTableLists() {
        dbHelper = new DBHelper(getContext());                                              //Создал экземпляр класса DBHelper для управдения БД
        database = dbHelper.getReadableDatabase();                                          //Получил доступ на чтение БД
        cursor = database.query(LISTS_TABLE_NAME, null, null, null, null, null, null);      //Пробежал cursor-ом по всем столбцам и строкам таблицы LISTS_TABLE_NAME
        String[] from = new String[]{DBHelper.colNamesLists, DBHelper.colDateLists};        //массив столбцов, поля которых собираемся отображать
        int[] to = new int[]{R.id.tvItemName, R.id.tvItemDate};                             //Массив View-компонентов для отображения этих стобцов
        sCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.item_listview, cursor, from, to, 0);   //Создал адаптер и настроил ему кастомный вид
        lvLists.setAdapter(sCursorAdapter);                                                 //Повесил адаптер на lvLists
        dbHelper.close();                                                                   //Закрыл подключение к БД
    }
 
}
Код Вызова
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppDefault);
        setContentView(R.layout.activity_main);
        Log.v(TAG, "Create MainActivity");
 
        /*Поиск вьюшек по ID*/
        toolbar = (Toolbar) findViewById(R.id.toolbar);
 
        setSupportActionBar(toolbar);   //Активирую Toolbar
 
                ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager);                                  //Нашел viewPager
        TabsPagerFragmentAdapter adapter = new TabsPagerFragmentAdapter(getSupportFragmentManager());   //Создаю экземпляр адаптера
        viewPager.setAdapter(adapter);                                                                  //Применяю адаптер к viewPager-у
 
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);                                 //Нашел tabLayout
        tabLayout.setupWithViewPager(viewPager);                                                        //Привязал к нему viewPager (т.к. они работают в связке "вкладка - соответсвующий контент")
 
 
    }
0
Миниатюры
Обновление данных в ViewPager при перелистывании вкладок  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2017, 18:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обновление данных в ViewPager при перелистывании вкладок (Программирование Android):

ViewPager обновление фрагментов - Программирование Android
Использую viewpager имеет три фрагмента. Как обновлять данные для второго фрагмента с первого фрагмента. И наоборот. Метод ...

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

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

Подключение к базе данных из ViewPager - Программирование Android
В приложении есть база данных, везде в приложении она работает хорошо, но есть небольшая проблема с ее использованием в ViewPager. При...

Обновление данных Activity при нажатии на кнопку - Программирование Android
Приветствую всех. Проблема такая: необходимо обновлять данные(ImageView, TextView и т.п.) в Activity при нажатии на кнопку. Создаю...

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

6
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
10.05.2017, 10:47 #2
ну навскидку можно так
1. создаем какой-нибудь интерфейс с методом и имплементируем его в наших фрагментах
Java
1
2
3
    interface MyFragmentInterface {
        void updateSomeData();
    }
то есть оба фрагмента должны быть с inplements MyFragmentInterface
2. вешаем на ViewPager слушателя
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
 
            @Override
            public void onPageSelected(int position) {
                Fragment fragment = adapter.getItem(position);
                if (fragment instanceof MyFragmentInterface) {
                    ((MyFragmentInterface) fragment).updateSomeData();
                }
            }
 
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
да в общем и все - в методе updateSomeData обновляем данные
0
Nakiii
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 80
10.05.2017, 15:32  [ТС] #3
Сделал по вашему совету.
Код интерфейса:
Java
1
2
3
4
5
package com.example.evgeny.myApp;
 
public interface Updateable {
    void update();
}
Имплементировал его в фрагмент:
Java
1
2
3
4
5
6
7
8
9
10
11
@Override
    public void update() {
        dbHelper = new DBHelper(getContext());                                              //Создал экземпляр класса DBHelper для управдения БД
        database = dbHelper.getReadableDatabase();                                          //Получил доступ на чтение БД
        cursor = database.query(LISTS_TABLE_NAME, null, null, null, null, null, null);      //Пробежал cursor-ом по всем столбцам и строкам таблицы LISTS_TABLE_NAME
        String[] from = new String[]{DBHelper.colNamesLists, DBHelper.colDateLists};        //массив столбцов, поля которых собираемся отображать
        int[] to = new int[]{R.id.tvItemName, R.id.tvItemDate};                             //Массив View-компонентов для отображения этих стобцов
        sCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.item_listview, cursor, from, to, 0);   //Создал адаптер и настроил ему кастомный вид
        lvLists.setAdapter(sCursorAdapter);                                                 //Повесил адаптер на lvLists
        dbHelper.close();                                                                   //Закрыл подключение к БД
    }
Код вызова в MainActivity:
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
public void initTabs(){
        ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager);                                  //Нашел viewPager
        final TabsPagerFragmentAdapter adapter = new TabsPagerFragmentAdapter(getSupportFragmentManager());   //Создаю экземпляр адаптера
        viewPager.setAdapter(adapter);                                                                  //Применяю адаптер к viewPager-у
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
            }
 
            @Override
            public void onPageSelected(int position) {
                Fragment fragment = adapter.getItem(position);
                if (fragment instanceof Updateable) {
                    ((Updateable) fragment).update();
                }
            }
 
            @Override
            public void onPageScrollStateChanged(int state) {
 
            }
        });
 
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);                                 //Нашел tabLayout
        tabLayout.setupWithViewPager(viewPager);                                                        //Привязал к нему viewPager (т.к. они работают в связке "вкладка - соответсвующий контент")
    }
Код ошибки:
Java
1
2
3
4
5
6
05-10 12:23:51.462 2586-2586/com.example.evgeny.ShoppingBudget E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: com.example.evgeny.ShoppingBudget, PID: 2586
                                                                                 java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
                                                                                     at com.example.evgeny.ShoppingBudget.fragments.SavedListsFragment.readTableLists(SavedListsFragment.java:84)
                                                                                     at com.example.evgeny.ShoppingBudget.fragments.SavedListsFragment.update(SavedListsFragment.java:124)
                                                                                     at com.example.evgeny.ShoppingBudget.MainActivity$1.onPageSelected(MainActivity.java:102)
Ошибка указывает вот на эту строчку кода в методе реализованного интерфейса:
Java
1
database = dbHelper.getReadableDatabase();    //Получил доступ на чтение БД
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
10.05.2017, 16:17 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в момент вызова update сонтекст явно == null
я бы попробовал переписать TabsPagerFragmentAdapter примерно так
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
public class TabsPagerFragmentAdapter extends FragmentStatePagerAdapter {
    private String[] tabs;
    
    private final ContentFragment contentFragment = new ContentFragment();
    private final SavedListsFragment savedListsFragment = new SavedListsFragment();
 
    public TabsPagerFragmentAdapter(FragmentManager fm) {
        super(fm);
        tabs = new String[]{"Главная", "Сохраненные"};  //Пункты TabLayout
    }
 
    @Override
    public CharSequence getPageTitle(int position) {
        return tabs[position];  //Получаю название выделеной вкладки
    }
 
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return contentFragment;
            case 1:
                return savedListsFragment;
        }
        return null;
    }
 
    @Override
    public int getCount() {
        return tabs.length;
    }
}
0
Nakiii
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 80
10.05.2017, 16:34  [ТС] #5
Господи...два дня с 10 до 23 часов я пытался решить эту проблему.
Вы даже не представляете насколько я вам благодарен)
Правда не совсем понимаю, вы ведь всего-лишь вынесли создание экземпляров фрагментов в отдельные переменные - и ошибка пропала, и все стало обновляться при перелистывании.
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
public class TabsPagerFragmentAdapter extends FragmentStatePagerAdapter {
    private String[] tabs;
    
    private final ContentFragment contentFragment = new ContentFragment();
    private final SavedListsFragment savedListsFragment = new SavedListsFragment();
 
    public TabsPagerFragmentAdapter(FragmentManager fm) {
        super(fm);
        tabs = new String[]{"Главная", "Сохраненные"};  //Пункты TabLayout
    }
 
    @Override
    public CharSequence getPageTitle(int position) {
        return tabs[position];  //Получаю название выделеной вкладки
    }
 
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return contentFragment;
            case 1:
                return savedListsFragment;
        }
        return null;
    }
 
    @Override
    public int getCount() {
        return tabs.length;
    }
}
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
10.05.2017, 16:42 #6
я предполагаю, что FragmentAdapter просто пересоздаёт или вытягивает из бандла фрагменты каждый раз когда вкладка меняется
и в момент вызова update() контекст там все еще равен null

а если их создать один раз то они пересоздаваться не будут при перелистывании
0
Nakiii
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 80
10.05.2017, 16:49  [ТС] #7
Понимаю, что мне нужно поднабраться знаний по работе с интерфейсами...
Еще раз огромное вам спасибо!
0
10.05.2017, 16:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2017, 16:49
Привет! Вот еще темы с ответами:

ViewPager - не удалять фрагмент при пролистывании - Программирование Android
Здравствуйте всем. Есть viewPager с тремя фрагментами. Так как он сохраняет объекты слева и справа. Можно реализовать так, когда я листаю...

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

Ошибка при создании вкладок в match_parent - Программирование Android
Здравствуйте. Пытаюсь научиться программировать под Андроид. Для того что бы понять как и что работает беру уже готовые примеры из книг или...

Прыгает текст при перелистывании картинок в слайдере - HTML, CSS
При перелистывании картинок в слайдере, прыгает текст в другом блоке. Как решить проблему, подскажите пожалуйста....


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

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

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