如何制作新的片段onTabSelected来刷新我的内容?

时间:2016-04-26 12:50:28

标签: android tabs fragment refresh

我正在尝试刷新我的片段,以便我可以向用户提供新信息。基本上我正在做一个应用程序来进行比赛。我的应用程序上有3个选项卡,第一个选项卡允许用户添加人员,第二个选项卡允许用户创建锦标赛,最后一个显示用户的分数。

enter image description here

但是我遇到了一个问题,当我从第一个选项卡中删除用户并且我转到我的第二个选项卡时我的内容没有更新,我真的希望它更新,我想要在它获得时创建一个新片段当它被选中时选择或尝试刷新它,但我是Android的新手,我真的不知道该怎么做。

任何想法?

这是我的MainActivity Code:

public class MainActivity extends AppCompatActivity{
    // Declaring Your View and Variables
    Toolbar toolbar;
    ViewPager viewPager;
    ViewPagerAdapter adapter;
    TabLayout tabLayout;
    CharSequence Titles[]={"Participantes","Torneio","Classificação"};
    int Numboftabs =3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        tabLayout = (TabLayout)findViewById(R.id.tabLayout);


        // Creating The Toolbar and setting it as the Toolbar for the activity
        setSupportActionBar(toolbar);
        // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
        adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);
        // Assigning ViewPager View and setting the adapter
        viewPager.setAdapter(adapter);


        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.colorTextIcons));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //should i refresh my tab here?
                // how do i do that ?
            }


            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        if (id == R.id.action_info) {
            Toast.makeText(getApplicationContext(), "Contacto: Juniortalisson16@gmail.com", Toast.LENGTH_LONG).show();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


}

这是我的ViewPageAdapter代码:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
    int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created


    // Build a Constructor and assign the passed Values to appropriate values in the class
    public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb) {
        super(fm);

        this.Titles = mTitles;
        this.NumbOfTabs = mNumbOfTabsumb;

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    }


    //This method return the fragment for the every position in the View Pager
    @Override
    public Fragment getItem(int position) {

        switch(position) {// if the position is 0 we are returning the First tab
            case 0:
            Tab1 tab1 = new Tab1();
            return tab1;
            case 1:
            Tab2 tab2 = new Tab2();
            return tab2;
            case 2:
            Tab3 tab3 = new Tab3();
            return tab3;
            default:
                return null;
        }


    }

    // This method return the titles for the Tabs in the Tab Strip

    @Override
    public CharSequence getPageTitle(int position) {
        return Titles[position];
    }

    // This method return the Number of tabs for the tabs Strip

    @Override
    public int getCount() {
        return NumbOfTabs;
    }
}

1 个答案:

答案 0 :(得分:2)

基于答案和一些测试,我面临同样的问题。

我有三分之一的选择(quite similar to the second method):

相反,你调用notifyDataSetChanged(),(这会在我的TabLayout中引起奇怪的行为),创建一个类型为ViewPager.OnPageChangeListener的侦听器,并直接调用片段更新方法。见代码:

public interface Updateable {
   public void update();
}


public class MyFragment extends Fragment implements Updateable {

   ...

   public void update() {
     // do your stuff on fragment became visible
   }
}

在活动主持人中:

mAdapter = new DashboardPagerAdapter(DashboardActivity.this,
        getSupportFragmentManager(), mTabs);
mAdapter.configure(mViewPager);
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
    @Override
    public void onPageSelected(int position) {
        if (mAdapter != null) {
            Updateable fragment = (Updateable)mAdapter.getItem(position);
            if (fragment != null) {
                fragment. update();
            }
        }
    }
});

这样就不会重新创建片段,只需运行更新方法即可。对我而言就足够了。