Android 如何在Fragements中使用view pager刷新选项卡页面

Android 如何在Fragements中使用view pager刷新选项卡页面,android,android-viewpager,Android,Android Viewpager,我使用viewpager在片段中有两个选项卡。我在两个选项卡中都有API rest调用,当我转到选项卡2(计时)并单击选项卡1(仪表板)时,我想刷新选项卡1我想再次调用API rest调用,但它不刷新。请帮助我。 这是我的查看寻呼机代码: public class TabSampleFragment extends Fragment { TabLayout gs_tabLayout; ViewPager gs_viewPager; ViewPagerAdapter mVi

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

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;
    }    
}
这是我的适配器代码:单击时如何刷新仪表板选项卡,碎片生命周期也不会调用(单击选项卡时启动、暂停、恢复、停止)

公共类ViewPagerAdapter扩展了FragmentStatePagerAdapter{
ArrayList片段=新的ArrayList();
ArrayList tabTitles=新的ArrayList();
公共void addFragments(片段片段、字符串标题){
Log.i(“RR”,“添加图形时”);
this.fragments.add(fragments);
this.tabTitles.add(titles);
}
公共ViewPagerAdapter(碎片管理器fm){
超级(fm);
}    
@凌驾
公共片段getItem(int位置){
返回碎片。获取(位置);
}    
@凌驾
public int getCount(){
返回fragments.size();
}    
@凌驾
公共字符序列getPageTitle(int位置){
返回tabTitles.get(位置);
}
}
这是我的仪表板代码。我在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{

        }
    }
}
在此处输入代码
公共类进度扩展片段{
ProgressBar gs_circularProgressBar;
公共进程对话;
ImageView gs_image_userProfileimage;
私有文本视图gs_text_用户名、gs_text_公司名称、gs_text_completedTaskasValue、gs_text_assignedTaskasValue、gs_AssignedTasktTextView、gs_text_totalDistanceValue、gs_totalDistanceTextView、gs_kmsLabel、gs_totalHoursTextView、gs_text_TotalHoursSavValue;
字体tf1、tf2、tf3、tf4;
浮动gs_var_dist_travel;
字符串gs_var_userimage、gs_var_username、gs_var_companyname、gs_var_total_task、gs_var_complete_task、gs_var_timetake、gs_var_roleid、gs_var_userid;
int gs_var_networkx=2;
公共进步(){
//必需的空公共构造函数
}
ProgressBar progressBar1;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.con\u片段\u进度,容器,错误);
gs_circularProgressBar=(ProgressBar)view.findViewById(R.id.gs_circularProgressBar);
GS_用户_仪表板(GS_var_roleid,GS_var_userid);
返回视图;
}
私有无效GS_用户_仪表板(字符串GS_var_roleid,字符串GS_var_userid){
StringRequest StringRequest=new StringRequest(Request.Method.GET,ServerUtils.Gs_User_Dashboard+“Gs_userId=“+Gs_var_userId+”&Gs_role=“+Gs_var_roleid,
新建com.android.volley.Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
}
},
新建com.android.volley.Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
//取消“进度”对话框
clearProgressDialog();
progressBar1.setVisibility(View.GONE);
//敬酒
}
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
Map params=新哈希表();
返回参数;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map params=新的HashMap();
返回参数;
}
@覆盖受保护的void deliverResponse(字符串响应){
super.deliverResponse(响应);
}
@覆盖公共无效交付错误(截击错误)
{
super.deliverError(错误);
//progressBar1.setVisibility(View.GONE);
Log.e(“deliverResponse”,“getNetworkTimeMs:+错误”);
}
};

RequestQueue RequestQueue=Volley.newRequestQueue(getActivity()); //将请求添加到队列 添加(stringRequest); } @凌驾 public void setUserVisibleHint(布尔值isVisibleToUser){ super.setUserVisibleHint(isVisibleToUser); 如果(isVisibleToUser){ //在此处加载数据并调用api GS_用户_仪表板(GS_var_roleid,GS_var_userid); Log.i(“EE”,“可见——进度”); }否则{ } } }
默认情况下,“查看寻呼机”将在当前选项卡的右侧和左侧选项卡上分别加载至少1个和1个。之所以这样做,主要是因为在滑动viewpager时,两个选项卡的某个区域都可见。对于这些平稳过渡,需要预加载

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

我建议您重写
setUserVisibleHint()
方法并在那里进行api调用

请尝试以下代码:

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

 }
}

请任何人帮助我解决上述问题。感谢您的解决方案。我使用此方法,并在单击选项卡时打印一个日志。但我必须调用我这样给出的API rest调用,但当我在片段中传递getcontext()时,它显示出一个问题。“试图在空对象引用上调用虚拟方法'java.io.File android.content.Context.getCacheDir()”。请帮助meAm使用字符串请求API,以便我需要在请求队列中传递内容,但其显示的是errorRequestQueue requestQueue=Volley.newRequestQueue(上下文)//将请求添加到队列requestQueue.add(stringRequest);请帮助我@Abhishek
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
 if (isVisibleToUser) {
   // load data here and api call
 }else{

 }
}