简体   繁体   English

调用notifydatasetchanged()时,FragmentStatePageAdapter不会刷新

[英]FragmentStatePageAdapter won't refresh when calling notifydatasetchanged()

I have an activity with a ViewPager and a Spinner and all I want to do is a change all pages content by selecting items in Spinner, to be more fully understood I'll explain - I am developing a simple TV-schedule weekly programm, so pages is a daily tv-programms and spinner is a tv-channels and when we've launch a programm it will display a short 4-items programm list for all channels and when we selected a "CNN" or whatever elese in spinner it will display a fully TV-programm list for a day which page is displaying(for displaying a days i use a TitlePageIndicator), so my problem is when I've selected an item in spinner, have loaded a data and have 我有一个使用ViewPager和Spinner的活动,我要做的就是通过在Spinner中选择项目来更改所有页面的内容,为了更全面地理解,我将解释-我正在开发一个简单的电视时间表每周节目,因此页面是每天的电视节目,微调器是电视频道,当我们启动一个节目时,它将显示所有频道的简短的4项节目列表,当我们在微调器中选择“ CNN”或其他菜单时,它将显示在显示页面的当天显示完整的电视节目列表(用于显示我使用TitlePageIndicator的日期),所以我的问题是当我在微调器中选择一个项目,加载了数据并具有
called a notifydatasetchanged() for my FragmentStatePagerAdapter - it won't refresh a pages. 为我的FragmentStatePagerAdapter调用了notifydatasetchanged()-它不会刷新页面。 I didn't get what I am doing wrong? 我没有弄错我在做什么?

MyAdapter 我的适配器

private class TVProgrammFragmentAdapter extends FragmentStatePagerAdapter {

    private FragmentManager fm;
    private ArrayList<TVProgrammFragment> mFragments;

    public TVProgrammFragmentAdapter(FragmentManager fm, ArrayList<TVProgrammFragment> mFragments) {
        super(fm);
        this.fm = fm;
        this.mFragments = mFragments;
    }

    public CharSequence getPageTitle(int position) {
        return ((TVProgrammFragment) mFragments.get(position)).getTitle();
    }

    public Fragment getItem(int arg0) {
        return mFragments.get(arg0);
    }

    public int getCount() {
        return mFragments.size();
    }

            // I don't know wherefore this line
            // It is a first issue that I've googled
            // And it's useless
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

}

Some code from MyActivity onCreate 来自MyActivity onCreate的一些代码

mAdapter = new TVProgrammFragmentAdapter(getSupportFragmentManager(), new ArrayList<TVProgrammFragment>());

    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    mIndicator = (TitlePageIndicator) findViewById(R.id.indicator);
    mIndicator.setTopPadding(0);
    mIndicator.setSelectedBold(true);
    mIndicator.setViewPager(mPager);
    mSpinner = (Spinner) findViewById(R.id.spinner);

    mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
            if (mChannelIndex != position) {
                String param = position == 0 ? String.valueOf(mTVProgrammAdapter.dates.get(mPager.getCurrentItem()).date) : String.valueOf(mTVProgrammAdapter.dates.get(mPager.getCurrentItem()).date) + "/" + String.valueOf(mTVProgrammAdapter.channels.get(position).id);
                 //Problems are here -->
                setParamsToPages(param);
                 //<--
                mChannelIndex = position;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

    });

    getTVProgrammDatesChannels();

And this is how I getting the data after app's launch 这就是我在应用启动后如何获取数据的方式

 //LoadHelper it is a class which does all data-loading things from server API
 //And it works perfectly with any problems
 LoadHelper.getTVProgrammDatesAndChannels(new OnLoadFinishedListener() {

        @Override
        public void onLoadFinished(final Object obj) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    mTVProgrammAdapter = ((TVProgrammAdapter) obj);
                    mTVProgrammAdapter.channels.add(0, new TVProgrammChannel("-1", ALL_CHANNELS));
                    mTVChannelsAdapter = new ChannelsAdapter(mTVProgrammAdapter.channels);
                    mSpinner.setAdapter(mTVChannelsAdapter);

                   //Setting a pages for a dates
                    for (TVProgrammDate date : mTVProgrammAdapter.dates) {
                        TVProgrammFragment tvFragmemnt = new TVProgrammFragment();
                        tvFragmemnt.setArguments(date);
                        ((TVProgrammFragmentAdapter) mPager.getAdapter()).mFragments.add(tvFragmemnt);
                    }

                    ((TVProgrammFragmentAdapter) mPager.getAdapter()).notifyDataSetChanged();
                    mViewFlipper.setDisplayedChild(1);
                }
            });
        }

And here goes my problems - is a setParamsToPages method 这就是我的问题-是setParamsToPages方法

    public void setParamsToPages(final String param) {

    new Thread(new Runnable() {

        @Override
        public void run() {
            final ArrayList<TVProgrammFragment> fragments = ((TVProgrammFragmentAdapter) mPager.getAdapter()).mFragments;

            //Here I setting a new fragments with new params to 
            //TVProgrammFragmentAdapter fragments ArrayList(mFragments)

            for (TVProgrammFragment tvFragmemnt : fragments) {
                TVProgrammFragment newFragment = new TVProgrammFragment();
                String title = tvFragmemnt.getTitle();
                newFragment.setArguments(title, param);
                fragments.set(fragments.indexOf(tvFragmemnt), newFragment);
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //doesn't do anything
                    mAdapter.notifyDataSetChanged();
                                            //mAdapter still displaying an "old"
                                            //fragments
                }

            });
        }

    });
}

I got it! 我知道了! I forgot to start a thread LOL!=) 我忘了开始一个线程大声笑!=)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ListView不会使用notifyDataSetChanged刷新 - ListView won't refresh using notifyDataSetChanged 调用notifyDataSetChanged()时,RecyclerView不会更新或刷新 - RecyclerView does not update or refresh when calling notifyDataSetChanged() 即使使用notifyDataSetChanged,我的ListFragment中的ArrayAdapter也不会刷新 - ArrayAdapter in my ListFragment won't refresh even when I use notifyDataSetChanged ListView 不会使用 notifydatasetchanged 刷新 - ListView doesn't refresh with notifydatasetchanged notifyDataSetChanged不刷新RecyclerView - notifyDataSetChanged doesn't refresh RecyclerView ListView不会在notifyDataSetChanged上刷新 - ListView doesn't refresh on notifyDataSetChanged 数据获取后,notifyDataSetChanged无法正常工作,第二次-ListView无法刷新 - notifyDataSetChanged not working after data fetch, the second time - ListView won't refresh 如何在不调用notifyDataSetChanged的情况下刷新适配器中的数据 - How to refresh data in adapter without calling notifyDataSetChanged Android Kotlin / Anko-notifyDataSetChanged()不刷新 - Android Kotlin/Anko - notifyDataSetChanged() doesn't refresh notifyDataSetChanged()不刷新我的视图 - notifyDataSetChanged() doesn't refresh my view
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM