我有一个带Viewpager和片段的布局(带有3个选项卡)。
我正在尝试从MainActivity发送已解析的Json数据(当提交searchview数据时)以显示在标签片段的textview中
数据已成功解析,但除非滚动到第3个标签,否则不会显示包含数据的textview(在第一个标签中)
///从MainActivity传递数据
public String getMyData() {
return meaning;
}
//从Fragment设置为textview的值
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v=inflater.inflate(R.layout.fragment_meaning, container, false);
MainActivity mainActivity= (MainActivity) getActivity();
assert mainActivity != null;
String data= mainActivity.getMyData();
TextView textView=v.findViewById(R.id.textVIew);
textView.setText(data);
return v;
}
希望能够在解析后立即显示数据更改,而不是滚动到第3个标签以查看更改
答案 0 :(得分:0)
以下一些步骤可能会对您有所帮助。
在创建的ViewPager适配器上,创建片段对象。像下面的
FragmentOne fragOne; // this should be global
在viewPager适配器上,执行以下操作
fragOne = new FragmentOne() // whatever your implementation is.
然后从服务器获取数据后,
if ( fragOne != null ) {
fragOne.setValueOnView( " your data to be passed" );
}
并在FragmentOne上创建一个名为setValueOnView
void setValueOnView(String yourString) {
v.findViewById(R.id.textVIew).setText(yourString);
}
还有一件事,在onCreateView上初始化片段时,创建了View对象
View v; // global variable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v=inflater.inflate(R.layout.fragment_meaning, container, false);
也将这种方法用于其他片段
答案 1 :(得分:0)
ViewPager类中的内部getItem()
方法使用带有Fragment
参数的String
构造函数
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
FragmentOne tab1 = new FragmentOne("string parameter");
return tab1;
case 1:
FragmentTwo tab2 = new FragmentTwo("string parameter");
return tab2;
case 2:
FragmentThree tab3 = new FragmentThree("string parameter");
return tab3;
default:
return null;
}
}
在片段内部:
public FragmentOne(String stringParameter) {
yourLocalVariable = stringParameter; // yourLocalVariable is declared inside Fragment class;
//now you can setText() for your TextView inside onViewCreated()
}
您当然可以像以前一样将String
从MainActivity
传递到ViewPager
。
答案 2 :(得分:0)
使用观察者
public class FragmentObserver extends Observable {
@Override
public void notifyObservers() {
setChanged(); // Set the changed flag to true, otherwise observers won't be notified.
super.notifyObservers();
}
}
活动:
public class MyActivity extends Activity {
private MyAdapter mPagerAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.my_activity);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new MyAdapter();
pager.setAdapter(mPagerAdapter);
}
private void updateFragments() {
mPagerAdapter.updateFragments();
}
}
Viewpager适配器
public class MyAdapter extends FragmentPagerAdapter {
private Observable mObservers = new FragmentObserver();
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
mObservers.deleteObservers(); // Clear existing observers.
Fragment fragment = new MyFragment();
if(fragment instanceof Observer)
mObservers.addObserver((Observer) fragment);
return fragment;
}
public void updateFragments() {
mObservers.notifyObservers();
}
}
您的片段
public class MyFragment extends Fragment implements Observer {
/* Fragment related stuff... */
@Override
public void update(Observable observable, Object data) {
View root = getView();
// Update your views here.
}
}
即使已经加载了片段,您也将获得用于更新方法的数据