如何在调用 MainActivity 的 OnCreate() 时初始化 Fragment 中的 ViewPagerAdapter?
How to initialize a ViewPagerAdapter in a Fragment when MainActivity's OnCreate() is called?
我得到了一个带有 ViewPager 的 Fragment,我得到了 FragmentStatePagerAdapter,它在 Fragment 的 OnCreateView() 方法中被初始化。为了设置数据,我在 Adapter:
中创建了方法 setData(List<String> data)
public void setData(List<String> data) {
this.data = data;
notifyDataSetChanged();
}
在我的 ViewPager 片段中,我得到了:
public void setData(List<String> data){
adapter.setData(data);
setCurrentItem(0);
}
到目前为止一切正常,但如果我调用 MainActivity 的 OnCreate():
fragment = (FragmentViewPager) getSupportFragmentManager().findFragmentByTag(TAG_VIEW_PAGER);
fragment.setData(myDataList);
它给我一个 Attempt to invoke virtual method ...setData(...) on a null object reference
错误,因为适配器尚未初始化。
我该如何解决这个问题?
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
showViewPager();
fragment = (FragmentViewPager) getSupportFragmentManager().findFragmentByTag(TAG_VIEW_PAGER);
fragment.setData(myDataList);
}
private void showViewPager() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = new FragmentViewPager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, TAG_VIEW_PAGER).commit();
fragmentManager.executePendingTransactions();
}
FragmentViewPager:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_view_pager, container, false);
viewPager = (ViewPager) layout.findViewById(R.id.pager);
adapter = new ViewPagerAdapter(getChildFragmentManager());
viewPager.setAdapter(adapter);
return layout;
}
public void setData(List<String> data){
adapter.setData(data);
setCurrentItem(0);
}
public void setCurrentItem(int position) {
viewPager.setCurrentItem(position);
}
ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private List<String> data;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public void setData(List<String> data) {
this.data = data;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new FragmentContent();
Bundle args = new Bundle();
args.putString(FragmentViewPager.ARG_STRING, data.get(i));
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
if (data != null) {
return data.size();
} else {
return 0;
}
}
@Override
public CharSequence getPageTitle(int position) {
return data.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
我认为在片段中,您可以声明一个 List 变量并在 setData() 方法中将数据设置到该变量。
public void setData(List<String> data){
this.data = data;
}
然后在 onCreateView() 中将片段的数据变量设置为适配器。
adapter.setData(this.data);
我没有测试过,请在您尝试后发表评论。 :)
我得到了一个带有 ViewPager 的 Fragment,我得到了 FragmentStatePagerAdapter,它在 Fragment 的 OnCreateView() 方法中被初始化。为了设置数据,我在 Adapter:
中创建了方法setData(List<String> data)
public void setData(List<String> data) {
this.data = data;
notifyDataSetChanged();
}
在我的 ViewPager 片段中,我得到了:
public void setData(List<String> data){
adapter.setData(data);
setCurrentItem(0);
}
到目前为止一切正常,但如果我调用 MainActivity 的 OnCreate():
fragment = (FragmentViewPager) getSupportFragmentManager().findFragmentByTag(TAG_VIEW_PAGER);
fragment.setData(myDataList);
它给我一个 Attempt to invoke virtual method ...setData(...) on a null object reference
错误,因为适配器尚未初始化。
我该如何解决这个问题?
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
showViewPager();
fragment = (FragmentViewPager) getSupportFragmentManager().findFragmentByTag(TAG_VIEW_PAGER);
fragment.setData(myDataList);
}
private void showViewPager() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = new FragmentViewPager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, TAG_VIEW_PAGER).commit();
fragmentManager.executePendingTransactions();
}
FragmentViewPager:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_view_pager, container, false);
viewPager = (ViewPager) layout.findViewById(R.id.pager);
adapter = new ViewPagerAdapter(getChildFragmentManager());
viewPager.setAdapter(adapter);
return layout;
}
public void setData(List<String> data){
adapter.setData(data);
setCurrentItem(0);
}
public void setCurrentItem(int position) {
viewPager.setCurrentItem(position);
}
ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private List<String> data;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public void setData(List<String> data) {
this.data = data;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new FragmentContent();
Bundle args = new Bundle();
args.putString(FragmentViewPager.ARG_STRING, data.get(i));
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
if (data != null) {
return data.size();
} else {
return 0;
}
}
@Override
public CharSequence getPageTitle(int position) {
return data.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
我认为在片段中,您可以声明一个 List 变量并在 setData() 方法中将数据设置到该变量。
public void setData(List<String> data){
this.data = data;
}
然后在 onCreateView() 中将片段的数据变量设置为适配器。
adapter.setData(this.data);
我没有测试过,请在您尝试后发表评论。 :)