私のアプリには2つのタブ(Androidデザインサポートライブラリ)があります。これはViewPagerAdapterのフラグメントです。
public class ListaCanali extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 2 ;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v =inflater.inflate(R.layout.lista_canali, container,false);
//Titolo Fragment
((MainActivity) getActivity()).setActionBarTitle("Lista Canali");
//FindViewById
tabLayout = (TabLayout) v.findViewById(R.id.tabs);
viewPager = (ViewPager) v.findViewById(R.id.viewpager);
//Funzioni Tab
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return v;
}
//Adattatore Tab
class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position){
case 0 : return new FragmentCanali();
case 1 : return new FragmentPreferiti();
}
return null;
}
public int getCount() {
return int_items;
}
public CharSequence getPageTitle(int position) {
switch (position){
case 0 :
return "Tutti";
case 1 :
return "Preferiti";
}
return null;
}
スワイプしてタブのタイトルをクリックすると、アプリの更新フラグメントが必要になります。これは発生しないためです。皆さんが私を助けてくれることを願っています。
これが唯一の/最良の方法ではないと確信しています。しかし、これは私と同じように問題を解決するはずです。
FragmentCanaliフラグメントとFragmentPreferitiフラグメントの両方でrefresh()メソッドを記述してください。
public class ListCanali extends Fragment implements OnPageChangeListener{
private MyAdapter mAdapter;
@Override
public View OnCreateView (...) {
...
if(mAdapter == null) {
mAdapter = new MyAdapter(getChildFragmentManager());
}
viewPager.setAdapter(mAdapter);
viewPager.setOnPageChangeListener(this);
...
}
...
@Override
public void OnPageSelected (int position) {
switch (position){
case 0 : ((FragmentCanali)adapter.getItem(position)).refresh();
case 1 : ((FragmentPreferiti)adapter.getItem(position)).refresh();
}
}}
抽象refresh()メソッドを持つベースフラグメントから両方のフラグメントを拡張すると、よりクリーンになります。
OnPageSelected()では、((BaseFragment)adapter.getItem(position)).refresh()
を呼び出すだけです。
これを試して...
更新するには最初にインスタンスが必要なフラグメント。
これを変える
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
に
ArrayList<Fragment> fr_list = new ArrayList<Fragment>();
fr_list.add(new FragmentCanali());
fr_list.add(new FragmentPreferiti());
MyAdapter mMyAdapter = new MyAdapter(getChildFragmentManager(),fr_list);
viewPager.setAdapter(mMyAdapter);
アダプターでこれを変更します
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position){
case 0 : return new FragmentCanali();
case 1 : return new FragmentPreferiti();
}
return null;
}
public int getCount() {
return int_items;
}
に
public MyAdapter(FragmentManager fm,ArrayList<Fragment> fr_list) {
super(fm);
this.fr_list=fr_list;
}
@Override
public Fragment getItem(int position)
{
return fr_list.get(position);
}
public int getCount() {
return fr_list.size();
}
フラグメント内にrefresh()メソッドを追加し、以下のように必要なときにいつでも呼び出します。
((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh();