除非滚动到第三个选项卡,否则Textview不会在第一个选项卡上更新

时间:2019-08-30 06:17:22

标签: android android-fragments android-viewpager

我有一个带Viewpager和片段的布局(带有3个选项卡)。

我正在尝试从MainActivity发送已解析的Json数据(当提交searchview数据时)以显示在标签片段的textview中

See this Image link

数据已成功解析,但除非滚动到第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个标签以查看更改

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() 
        }

您当然可以像以前一样将StringMainActivity传递到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.
    }
}

即使已经加载了片段,您也将获得用于更新方法的数据