2016-10-25 4 views
0

현재 채팅 응용 프로그램을 만들고 있습니다. 응용 프로그램을 시작하면 API 호출이 정보를 가져옵니다. 이 호출에서 for 루프는 API에서 수신되는 JSON 배열에서 객체를 생성하기 위해 작성됩니다. 여기에서 어댑터와 레이아웃 관리자를 설정하는 핸들러가 호출됩니다. 목록 중 하나를 클릭하면뒤로 버튼 업데이트 목록

enter image description here

이 그렇게 같은 채팅을 열어 (주의 사항이 스레드의 마지막 메시지를 보여줍니다) : 아래

처럼 보이는 것입니다.

enter image description here

내가 메시지를 입력 한 다음 메시지의 내 목록으로 돌아갑니다 뒤로 버튼을 눌러 전송을 클릭

. 이전과 동일한 화면을 표시합니다 (마지막으로 보낸 메시지가 업데이트되지 않음). 앱을 다시 시작하면 API에서 가져오고 마지막 메시지가 표시됩니다.

기본적으로 프래그먼트를 다시 작성하거나 뒤로 버튼을 누르면 API를 다시 호출하는 방법은 무엇입니까?

조각 :

public class conversationsFragment extends Fragment { 

private RecyclerView usersListView; 

ArrayList<MessageData> arrMessageData; //= new ArrayList<MessageData>(); 

conversationRecyclerViewAdapter adapter; 
Bitmap image; 


public conversationsFragment() { 
    // Required empty public constructor 
} 

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

} 

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

    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_conversations, container, false); 

    usersListView = (RecyclerView) rootView.findViewById(R.id.conversationsListView); 


    new Load().execute(null, null, null); 




    return rootView; 

} 


class Load extends AsyncTask<Void, Void, Void> { 

    ProgressDialog pd; 

    private Context context; 

    @Override 
    protected Void doInBackground(Void... params) { 




     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new BasicAuthInterceptor()).addNetworkInterceptor(new StethoInterceptor()).build(); 

     String credentials = "ezhu:[email protected]"; 
     String auth = "Basic " 
       + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 

     Log.e("Test", auth); 




     SharedPreferences settings = PreferenceManager 
       .getDefaultSharedPreferences(getActivity()); 
     String auth_token_string = settings.getString("token", ""/*default value*/); 
     String auth_token_type = settings.getString("tokenType", ""); 
     String userId = settings.getString("userId", ""); 

     Log.i("prefs", auth_token_type); 



     String url = "https://staging.vitalengine.com/portal-api/api/user/inbox/list?userId=" + 
       userId + 
       "&folderId=-1&tagId=0&page=1&itemPerPage=1000&showMsgInFolder=false"; 


     Request request = new Request.Builder().url(url) 
       .addHeader("Authorization", auth_token_type + " " + auth_token_string) 
       .addHeader("user-tz", "-330") 
         //.addHeader("Content-Type", "application/json") 
       .build(); 




     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       // Log.i(TAG, "call api error"); 
       Log.e("Volley", e.toString()); 
      } 

      @Override 
      public void onResponse(Call call, okhttp3.Response response) { 

       try { 
        if (!response.isSuccessful()) 
         throw new IOException("Unexpected code " + response); 
        final String body = response.body().string(); 


        JSONObject Jobject = new JSONObject(body); 



        JSONObject sub = Jobject.getJSONObject("response"); 
        JSONArray Jarray = sub.getJSONArray("inboxMsgList"); 



        arrMessageData = new ArrayList<>(); 

        for (int i = 0; i < Jarray.length(); i++) { 
         JSONObject object = Jarray.getJSONObject(i); 

         if (object.get("messageType").equals("CONVERSATION")) { 



          Log.e("ConversationTest", object.getString("fromUser")); 

          MessageData msg3 = new MessageData(); 
          msg3.setName((String) object.get("fromUser")); 
          msg3.setMessage((String) object.get("message")); 
          getImage((String) object.get("photo")); 
          msg3.setImage(image); 
          msg3.setRead(true); 
          msg3.setSubject((String) object.get("subject")); 
          msg3.setType((String) object.get("conversationDate")); 
          msg3.setId((Integer) object.get("conversationId")); 

          arrMessageData.add(msg3); 
         } else { 

         } 




         handler.sendEmptyMessage(1); 

        } 



       } catch (Exception e) { 

       } 

      } 


     }); 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pd = new ProgressDialog(getActivity()); 
     pd.setMessage("loading"); 
     pd.show(); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     if (pd != null) 
     { 
      pd.dismiss(); 
     } 
    } 
} 


private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case 1: 
       adapter = new conversationRecyclerViewAdapter(getActivity().getBaseContext(), arrMessageData); 
       usersListView.setAdapter(adapter); 
       LinearLayoutManager layoutManager 
         = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); 
       usersListView.setLayoutManager(layoutManager); 
       break; 
      default: 
       Log.d("TAG", msg.what + " ? "); 
       break; 
     } 
    } 
}; 
+0

당신은 단순히 onBackPressed를 오버라이드 (override)를해야한다(). 그런 다음 해당 메소드에서 필요한 업데이트를 수행 할 수 있습니다. – Shadesblade

+0

그걸 시도해 보니 onBackPressed 메소드가 사용되지 않는다고합니다. 이것이 조각이라는 것이 중요합니까? 내가 달릴 때도 오류가 발생합니다. 오류 : (67, 5) 오류 : 메소드가 상위 유형의 메소드를 대체하거나 구현하지 않습니다. – Adilp

+0

프래그먼트를 호출하는 Activity에서 onBackPressed를 대체합니다. – Shadesblade

답변

1

이 작업

@Override 
public void onBackPressed() { 
      if(adapter!=null)  
      adapter.notifyDataSetChanged(); 
} 
+0

그걸 시도해 보니 onBackPressed 메서드가 사용되지 않는다고합니다. 이것이 조각이라는 것이 중요합니까? 내가 달릴 때도 오류가 발생합니다. 오류 : (67, 5) 오류 : 메소드가 상위 유형의 메소드를 대체하거나 구현하지 않습니다. – Adilp

+0

활동 내에 구현하십시오. –