How to update recyclerview in the second tab in viewpager from first tab?

给你一囗甜甜゛ 提交于 2019-12-05 10:00:49

问题


One of the problems I am currently facing is that if a user adds something to their timetable, it should be refreshed in the recyclerview in the second tab Current Timetable. However, it never updates and the user has to go back to the main menu, back onto the Timetables activity and then select Current Timetable. I believe it is something to do with my ViewPager and its adapter. I just can't see where I am going wrong and I am sure it is something simple that I am missing. Please could you modify my code such that it will work

Here is my code: The viewpager class

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

The fragmentpageradapter class:

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];
    }
}

This is the CurrentTimetable class:

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

Would really mean a lot of someone could help me out

Thanks


回答1:


There are some changes needed in your code. If you check Fragment's LifeCycle you will understand how it works with Tabular View.

Check out Code I have made from above code.

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

I might have forgot something from your code and you might have to add it.




回答2:


You have to create an interface in mainActivity. Reference it in your fragments. Its is the best way to communicate from one fragment to another. Please refer the link below.

http://developer.android.com/training/basics/fragments/communicating.html

Have a look and if any doubts am here to help.



来源:https://stackoverflow.com/questions/36101368/how-to-update-recyclerview-in-the-second-tab-in-viewpager-from-first-tab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!