如何从第一个选项卡更新viewpager第二个选项卡中的recyclerview? [英] How to update recyclerview in the second tab in viewpager from first tab?

查看:116
本文介绍了如何从第一个选项卡更新viewpager第二个选项卡中的recyclerview?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前面临的问题之一是,如果用户向时间表添加了某些内容,则应在第二个选项卡Current Timetable中的recyclerview中对其进行刷新.但是,它永远不会更新,用户必须返回主菜单,回到Timetables活动,然后选择Current Timetable.我相信这与我的ViewPager及其适配器有关.我只是看不到我要去哪里错,而且我确定这很简单,我很想念.请您修改我的代码,使其可以工作

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

这是我的代码: viewpager类

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

fragmentpageradapter类:

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

这是CurrentTimetable类:

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

谢谢

推荐答案

您的代码需要进行一些更改.如果您查看Fragment的 LifeCycle ,您将了解它如何与表格视图一起使用.

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.

这篇关于如何从第一个选项卡更新viewpager第二个选项卡中的recyclerview?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆