Android 如何从第一个选项卡更新viewpager第二个选项卡中的recyclerview?

Android 如何从第一个选项卡更新viewpager第二个选项卡中的recyclerview?,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,我目前面临的一个问题是,如果用户向其时间表中添加了内容,则应在第二个选项卡的当前时间表中的回收视图中刷新该内容。但是,它从不更新,用户必须返回主菜单,返回时间表活动,然后选择当前时间表。我相信这与我的ViewPager及其适配器有关。我只是看不出我哪里出了问题,我确信我错过了一些简单的东西。请你修改一下我的代码好让它正常工作吗 这是我的密码: viewpager类 public class Timetables extends AppCompatActivity{ TabLayout t

我目前面临的一个问题是,如果用户向其时间表中添加了内容,则应在第二个选项卡的
当前时间表
中的
回收视图中刷新该内容。但是,它从不更新,用户必须返回主菜单,返回
时间表
活动,然后选择
当前时间表
。我相信这与我的
ViewPager
及其适配器有关。我只是看不出我哪里出了问题,我确信我错过了一些简单的东西。请你修改一下我的代码好让它正常工作吗

这是我的密码: viewpager类

public class Timetables extends AppCompatActivity{
    TabLayout tabLayout;
    ViewPager viewPager;
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.timetables);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        TimetablesAdapter timetablesAdapter = new TimetablesAdapter(getSupportFragmentManager(), Timetables.this);
        viewPager.setAdapter(timetablesAdapter);
        viewPager.setOffscreenPageLimit(2);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //viewPager.setCurrentItem(tab.getPosition());
            }
        });
    }
}
fragmentpageradapter类:

public class TimestableAdapter extends FragmentPagerAdapter{

    String tabNames[] = new String[] {"All timetables", "Current Timetable", "Expired"};
    Context context;

    public TimestableAdapter(FragmentManager fragmentManager, Context context){
        super(fragmentManager);
        this.context = context;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new AllTimetables();
            case 1:
                return new CurrentTimetables();
            case 2:
                return new ExpiredTimetables();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return tabNames.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabNames[position];
    }
}
这是
CurrentTimeline
课程:

public class CurrentTimetables extends Fragment {
    RecyclerView recyclerView;
    static MusicRecyclerAdapter adapter;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<Timetables> list;

    public CurrentTimetables(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.currenttimetable, container, false);
        recyclerView = (RecyclerView) rootView.findViewById(R.id.timetablerecyclerView);
        recyclerView.setHasFixedSize(true);
        list = new ArrayList<Timetables>();
        adapter = new MusicRecyclerAdapter(list, CurrentTimetables.this);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(adapter);
        tabBackground = new TabBackground(CurrentTimetables.this, list, spinnerItems, adapter, spinnerAdapter);
        tabBackground.populateConditionsList();
        inputs = new ArrayList<>();
        populate();
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

    }

    @Override
    public void onStart() {
        super.onStart();
    }

    public void populate(){
        String dbURL = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        RequestQueue requestQueue = Volley.newRequestQueue(fragment.getActivity());
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest
                (dbURL, new Response.Listener<JSONArray>(){

                    @Override
                    public void onResponse(JSONArray jsonArray) {
                        if(!list.isEmpty()){
                            list.clear();
                        }
                        try {
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);

                                int timetableID = Integer.parseInt(jsonObject.getString("timetableID"));
                                String timetableName = jsonObject.getString("timetableName");
                                String subjectName = jsonObject.getString("subjectName");

                                Timetables timetables = new Timetables(timetableID, timetableName, subjectName);
                                list.add(timetables);
                                adapter.notifyDataSetChanged();
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener(){

                    @Override
                    public void onErrorResponse(VolleyError volleyError) {

                    }
                }
                );
        requestQueue.add(jsonArrayRequest);
    }
 }
公共类CurrentTimetables扩展片段{
回收视图回收视图;
静态音乐循环适配器;
RecyclerView.LayoutManager LayoutManager;
数组列表;
公共时刻表(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.currentTimeline,container,false);
recyclerView=(recyclerView)rootView.findViewById(R.id.timetablerecyclerView);
recyclerView.setHasFixedSize(true);
列表=新的ArrayList();
adapter=新的MusicRecyclerAdapter(列表,CurrentTimetables.this);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getActivity().getApplicationContext());
linearLayoutManager.setOrientation(linearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(适配器);
tabBackground=新的tabBackground(CurrentTimetables.this、list、spinnerItems、adapter、spinnerAdapter);
tabBackground.populateConditionsList();
输入=新的ArrayList();
填充();
返回rootView;
}
@凌驾
恢复时公开作废(){
super.onResume();
}
@凌驾
已创建视图上的公共void(视图,捆绑保存状态){
}
@凌驾
public void onStart(){
super.onStart();
}
公共空白填充(){
字符串dbURL=“xxxxxxxxxxxxxxxxxxxxxxxxx”;
RequestQueue RequestQueue=Volley.newRequestQueue(fragment.getActivity());
JsonArrayRequest JsonArrayRequest=新JsonArrayRequest
(dbURL,新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray JSONArray){
如果(!list.isEmpty()){
list.clear();
}
试一试{
for(int i=0;i
这真的意味着有很多人可以帮助我


谢谢

您必须在mainActivity中创建一个界面。在片段中引用它。它是从一个片段到另一个片段通信的最佳方式。请参考下面的链接


请看一看,如果有任何疑问,我将在此提供帮助。

您的代码中需要进行一些更改。如果您检查片段,您将了解它如何与表格视图一起工作

检查代码,我已经从上述代码

public class CurrentTimetables extends Fragment {
    RecyclerView recyclerView;
    static MusicRecyclerAdapter adapter;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<Timetables> list;
    Context context;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.currenttimetable, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        recyclerView = (RecyclerView) view.findViewById(R.id.timetablerecyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        tabBackground = new TabBackground(CurrentTimetables.this, list, spinnerItems, adapter, spinnerAdapter);
        tabBackground.populateConditionsList();
        // If you have another Component add here using finViewById() and also you can do
        // other process here. I just used setUserVisibleHint because it will execute when
        // fragment will be visible to user and it will stop over calling to web service.
        /**
         * Populate Recyclerview data if setUserVisibleHint do not work.
         */
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            populate();
        }
    }

    public void populate() {
        String dbURL = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        RequestQueue requestQueue = Volley.newRequestQueue(context);
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(dbURL, new Response.Listener<JSONArray>() {

            @Override
            public void onResponse(JSONArray jsonArray) {
                if (!list.isEmpty()) {
                    list.clear();
                }
                try {
                    list = new ArrayList<Timetables>();
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);

                        int timetableID = Integer.parseInt(jsonObject.getString("timetableID"));
                        String timetableName = jsonObject.getString("timetableName");
                        String subjectName = jsonObject.getString("subjectName");

                        Timetables timetables = new Timetables(timetableID, timetableName, subjectName);
                        list.add(timetables);
                        adapter = new MusicRecyclerAdapter(list, context);
                        recyclerView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(5 * 1000, 1, 1.0F));
        jsonArrayRequest.setShouldCache(false);
        requestQueue.add(jsonArrayRequest);
    }

    @Override
    public void onResume() {
        super.onResume();
        populate();
    }
}
公共类CurrentTimetables扩展片段{
回收视图回收视图;
静态音乐循环适配器;
RecyclerView.LayoutManager LayoutManager;
数组列表;
语境;
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
this.context=上下文;
}
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
返回充气机。充气(R.layout.CurrentSchedule,容器,假);
}
@凌驾
已创建视图上的公共void(视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
recyclerView=(recyclerView)view.findViewById(R.id.timetablerecyclerView);
recyclerView.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(上下文));
tabBackground=新的tabBackground(CurrentTimetables.this、list、spinnerItems、adapter、spinnerAdapter);
tabBackground.populateConditionsList();
//如果您有另一个组件,请使用finViewById()在此处添加,您也可以这样做
//这里是另一个进程。我刚才使用了setUserVisibleHint,因为它将在
//该片段将对用户可见,它将停止对web服务的调用。
/**
*如果setUserVisibleHint不起作用,则填充Recyclerview数据。
*/
}