0

I have a fragment which is called from an activity to display in one of its tabs. I want the fragment data to be refreshed everytime I click the tab button of the fragment.
Here is my fragment-

public class ChatFragment extends Fragment {

    private String TAG = MainActivity.class.getSimpleName();
    private ArrayList<ChatRoom> chatRoomArrayList;
    private ChatRoomsAdapter mAdapter;
    private RecyclerView recyclerView;
    View convertedView;
    private String selfUserId;


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

        convertedView = inflater.inflate(R.layout.content_main, null, false);
        return convertedView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);

        //setListAdapter(adapter);
        //getListView().setOnItemClickListener(this);
        //registerForContextMenu(getListView());

        recyclerView = (RecyclerView) convertedView.findViewById(R.id.recycler_view);

        selfUserId = MyApplication.getInstance().getPrefManager().getUser().getId();

        chatRoomArrayList = new ArrayList<>();
        mAdapter = new ChatRoomsAdapter(getContext(), chatRoomArrayList);

        final LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.addItemDecoration(new SimpleDividerItemDecoration(
                getContext().getApplicationContext()
        ));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        recyclerView.addOnItemTouchListener(new ChatRoomsAdapter.RecyclerTouchListener(getContext().getApplicationContext(),
                recyclerView, new ChatRoomsAdapter.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                // when chat is clicked, launch full chat thread activity
                ChatRoom userChatRoom = chatRoomArrayList.get(position);
                Intent intent = new Intent(getContext(), ChatRoomActivity.class);
                intent.putExtra("user_id", userChatRoom.getId());
                intent.putExtra("name", userChatRoom.getName());
                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));

        fetchChats();
    }

    private void fetchChats() {
        String endPoint = EndPoints.CHAT_ROOMS.replace("_ID_", selfUserId);
        Log.e(TAG, "endPoint: " + endPoint);
        StringRequest strReq = new StringRequest(Request.Method.GET,
                endPoint, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.e(TAG, "response: " + response);

                try {
                    JSONObject obj = new JSONObject(response);

                    // check for error flag
                    if (obj.getBoolean("error") == false) {
                        JSONArray chatRoomsArray = obj.getJSONArray("chat_rooms");
                        for (int i = 0; i < chatRoomsArray.length(); i++) {
                            JSONObject chatRoomsObj = (JSONObject) chatRoomsArray.get(i);
                            ChatRoom cr = new ChatRoom();
                            cr.setId(chatRoomsObj.getString("user_id"));
                            cr.setName(chatRoomsObj.getString("name"));
                            cr.setLastMessage("");
                            cr.setUnreadCount(0);
                            cr.setTimestamp(chatRoomsObj.getString("created_at"));

                            chatRoomArrayList.add(cr);
                        }

                    } else {
                        // error in fetching chat rooms
                        Toast.makeText(getContext().getApplicationContext(), "" + obj.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
                    }

                } catch (JSONException e) {
                    Log.e(TAG, "json parsing error: " + e.getMessage());
                    Toast.makeText(getContext().getApplicationContext(), "Json parse error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }

                mAdapter.notifyDataSetChanged();

                // subscribing to all chat room topics
                //subscribeToAllTopics();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                NetworkResponse networkResponse = error.networkResponse;
                Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse);
                Toast.makeText(getContext().getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

        //Adding request to request queue
        MyApplication.getInstance().addToRequestQueue(strReq);
    }
}

Whenever I open the tab to display this fragment, I want my fetchChats() to be called to refresh the view in the fragment with the newly updated Chats. How can I do this?
Error log-

FATAL EXCEPTION: main
                                                            Process: com.wipro.chat, PID: 19283
                                                            java.lang.NullPointerException: replacement == null
                                                                at java.lang.String.replace(String.java:972)
                                                                at com.wipro.chat.tabs.ChatFragment.fetchChats(ChatFragment.java:112)
                                                                at com.wipro.chat.tabs.ChatFragment.setUserVisibleHint(ChatFragment.java:107)
                                                                at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
                                                                at android.support.v4.view.ViewPager.populate(ViewPager.java:1175)
                                                                at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
                                                                at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668)
                                                                at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
                                                                at android.view.View.measure(View.java:18788)
                                                                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
                                                                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
                                                                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
                                                                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                at android.view.Choreographer.doFrame(Choreographer.java:606)
                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                at android.os.Looper.loop(Looper.java:148)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Visualisation App
  • 678
  • 3
  • 9
  • 25

2 Answers2

1

Override onResume() method in your fragment and simply call fetchChats() in onResume().

Also you can do this in onStart() method of your fragment.

If these methods don't get called in your case, change fetchChats() from private to public. Then keep a reference to your fragment. Add a listener to your tab that is called when they are selected and call fragment.fetchChats() when the desired tab is selected.

Misagh Emamverdi
  • 3,654
  • 5
  • 33
  • 57
0

Overide a method in your fragment

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
       //do your work here
    }
  }
Aman Jain
  • 2,975
  • 1
  • 20
  • 35