android - 如何在 Fragment 中使用 viewpager 刷新标签页

标签 android android-viewpager

我使用 viewpager 在我的 fragment 中有两个选项卡。当我转到选项卡 2(时钟)并单击选项卡 1(仪表板)时,我在两个选项卡中都有 API 休息调用我想刷新选项卡 1 我想再次调用 API 休息调用,但它没有刷新。请帮助我。 这是我的查看寻呼机代码:

public class TabSampleFragment extends Fragment {
    TabLayout gs_tabLayout;
    ViewPager gs_viewPager;
    ViewPagerAdapter mViewPagerAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {    

        final View view = inflater.inflate(R.layout.activity_frag_tabs, container, false);
        gs_tabLayout = (TabLayout)view.findViewById(R.id.gs_tabLayout);
        gs_viewPager = (ViewPager)view.findViewById(R.id.gs_viewPager);
        mViewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
        mViewPagerAdapter.addFragments(new Progress(), "Dashboard");
        mViewPagerAdapter.addFragments(new ClockInDetails(), "Clocking");
        gs_viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }  @Override
              public void onPageSelected(int position) {
                     mViewPagerAdapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
                                          }   
            @Override
            public void onPageScrollStateChanged(int state) { 
            }
        });
        gs_viewPager.setAdapter(mViewPagerAdapter);
        gs_tabLayout.setupWithViewPager(gs_viewPager);
        gs_tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        mViewPagerAdapter.notifyDataSetChanged();
        return view;
    }    
}

这是我的适配器代码:单击时如何刷新仪表板选项卡, fragment 生命周期也不调用(单击选项卡时开始、暂停、恢复、停止)

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
  ArrayList<Fragment> fragments = new ArrayList<>();
    ArrayList<String> tabTitles = new ArrayList<>();

    public void addFragments(Fragment fragments, String titles){
        Log.i("RR","on add-gragment");
        this.fragments.add(fragments);
        this.tabTitles.add(titles);
    }

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }    
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);

    }    
    @Override
    public int getCount() {
        return fragments.size();
    }    
    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles.get(position);
    }

}

这是我的仪表板代码。我在 oncreate 和 uservisiblehint 方法中使用字符串请求调用 REST API。如果我没有在 uservisiblehint 方法中调用 rest 调用它的工作,但如果我调用意味着它显示问题

enter code here
public class Progress extends Fragment {
    ProgressBar gs_circularProgressBar;
    public ProgressDialog mProgDialog;
    ImageView gs_image_userProfileimage;
    private TextView gs_text_username, gs_text_companyname, gs_text_completedTaskasValue,  gs_text_assignedTaskasValue, gs_assignedTaskTextView, gs_text_totalDistanceValue, gs_totalDistanceTextView, gs_kmsLabel, gs_totalHoursTextView, gs_text_totalHoursasValue;
    Typeface tf1, tf2, tf3, tf4;
    Float gs_var_dist_travel;
    String gs_var_userimage,gs_var_username,gs_var_companyname,gs_var_total_task,gs_var_complete_task,gs_var_timetaken,gs_var_roleid,gs_var_userid;
    int gs_var_networkx=2;
    public Progress() {
        // Required empty public constructor
    }

ProgressBar progressBar1;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.con_fragment_progress, container, false);
        gs_circularProgressBar = (ProgressBar)view.findViewById (R.id.gs_circularProgressBar);
        GS_User_Dashboard(gs_var_roleid,gs_var_userid);

        return view;
    }



    private void GS_User_Dashboard( String gs_var_roleid, String gs_var_userid) {
       StringRequest stringRequest = new StringRequest(Request.Method.GET, ServerUtils.Gs_User_Dashboard+"gs_userId="+gs_var_userid+"&gs_role="+gs_var_roleid,
                new com.android.volley.Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                    }
                },
                new com.android.volley.Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        //Dismissing the progress dialog
                        clearProgressDialog();
                        progressBar1.setVisibility(View.GONE);
                        //Showing toast
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new Hashtable<String, String>();
                return params;
            }
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                return params;
            }

            @Override protected void deliverResponse(String response) {
                super.deliverResponse(response);
            }
            @Override public void deliverError(VolleyError error)
            {
                super.deliverError(error);
              //  progressBar1.setVisibility(View.GONE);
                Log.e("deliverResponse", "getNetworkTimeMs : " + error);
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        //Adding request to the queue
        requestQueue.add(stringRequest);
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            // load data here and api call
        GS_User_Dashboard(gs_var_roleid,gs_var_userid);
         Log.i("EE","visible--progress");
        }else{

        }
    }
}

最佳答案

View pager will by default load atleast 1 on the right and one on the left tab of current tab. It is done so, mostly because there is a point when u slide viewpager, when certain area of both tabs is visible. For those smooth transitions preloading is required.

但是由于您只有两个选项卡,所以这是一个问题,两个选项卡都是预加载的,当您转到第二个选项卡时不会刷新。

我建议您覆盖 setUserVisibleHint() 方法并在那里调用 api。

试试下面的代码:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
 if (isVisibleToUser) {
   // load data here and api call
 }else{

 }
}

关于android - 如何在 Fragment 中使用 viewpager 刷新标签页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48823671/

相关文章:

android - 获取正在运行的 gradle 任务名称

android - 将图标添加到 SlidingTabLayout 而不是文本

android - 以编程方式在 ViewPager.OnPageChangeListener onPageSelected() 中隐藏软键盘?

android - 在 FragmentPagerAdapter 上添加 PreferenceFragment

带有选项卡保存状态的 Android ViewPager

android - 从 xml 文件 android 中的 Assets 文件夹定义字体

android - 一旦在编辑器中打开 C 文件,C JNI 代码就会在 Android Eclipse 项目中引入错误

android - 如何在android中更新RecyclerView的单个图像

android - 读取无源 RFID 关键标签

android - 如何将一个 ViewPager 与另一个 ViewPager 叠加