Параметр PageAdapter не обновляется в NotificationDataSetChanged - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю приложение, в котором мне нужно отправить данные в RecyclerView на ViewPager, эти данные представляют собой некоторые json-запросы из API.

"onResult" моей модификации говорит, что данные - это правильный запрос, поэтому здесь нет проблем.

Но когда я обновляю адаптер ViewPager, данные из переменной не обновляются, что бы я ни делал. Есть идеи?

  1. Я попытался поместить viewpager.setAdapter ([...]) в onResult, после того, как переменная начала.

  2. Я запускаю переменную непосредственно перед setAdapter, здесь это сработало. (так что перемещение переменных данных в порядке)

  3. Когда я Log.d () переменная, инициированная с данными модернизации, она отображается.

MainFragment

List<News> news = new ArrayList<>();

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable iewGroup container, @Nullable Bundle savedInstanceState) {

        ...
    pager.setAdapter(new PageAdapter(Objects.requireNonNull(getActivity()).getSupportFragmentManager(),
            pageTitles,
            news));
        ...
}

@Override
public void onResult(List<News> news) {
    this.news = news; // At this step news contain 12 elements of type news.
    pager.getAdapter().notifyDataSetChanged();
}

PageAdapter

    ...
@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}
    ...

Прямо сейчас, когда я вхожу в адаптер после обновления, переменная все еще пуста.

Я просто хочу, чтобы мои данные передавались через адаптер после обновления onResult ^^.

Чуть ниже всего класса MainFragment и адаптера

-----------------------------------

Основной фрагмент

public class MainFragment extends Fragment implements NewsAsyncTask.Listeners{

ViewPager pager;
List<News> news = new ArrayList<>();
ArrayList<String> pageTitles = new ArrayList<>();

public MainFragment(){}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View result = inflater.inflate(R.layout.fragment_main, container, false);

    pager = (ViewPager) result.findViewById(R.id.main_viewpager);

    new NewsAsyncTask(this).execute("JakeWharton");

    pageTitles.add(getString(R.string.page_title_topstories));
    pageTitles.add(getString(R.string.page_title_mostpopular));
    pageTitles.add(getString(R.string.page_title_favorites));

    News test = new News();
    test.setTitle("TEST");

    news.add(test);

    Log.d("[********]",news.get(0).getTitle());

    pager.setAdapter(new PageAdapter(Objects.requireNonNull(getActivity()).getSupportFragmentManager(),
            pageTitles,
            news));

    TabLayout tabs = (TabLayout) result.findViewById(R.id.main_tablayout);

    tabs.setupWithViewPager(pager);

    tabs.setTabMode(TabLayout.MODE_FIXED);

    return result;
}

@Override
public void onResult(List<News> news) {
    this.news = news;
    pager.getAdapter().notifyDataSetChanged();
}

PageAdapter

public class PageAdapter extends FragmentPagerAdapter {


    private final ArrayList<String> pageTitle;
    private List<News> news;

    public PageAdapter(FragmentManager fm, ArrayList<String> pageTitle, List<News> news) {
        super(fm);

        this.pageTitle = pageTitle;
        this.news = news;
    }

    @Override
    public Fragment getItem(int i) {
        return PageFragment.newInstance(news);
    }

    @Override
    public int getCount() {
        return pageTitle.size();
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return pageTitle.get(position);
    }
}
...