현재 채팅 응용 프로그램을 만들고 있습니다. 응용 프로그램을 시작하면 API 호출이 정보를 가져옵니다. 이 호출에서 for 루프는 API에서 수신되는 JSON 배열에서 객체를 생성하기 위해 작성됩니다. 여기에서 어댑터와 레이아웃 관리자를 설정하는 핸들러가 호출됩니다. 목록 중 하나를 클릭하면뒤로 버튼 업데이트 목록
이 그렇게 같은 채팅을 열어 (주의 사항이 스레드의 마지막 메시지를 보여줍니다) : 아래
처럼 보이는 것입니다.
내가 메시지를 입력 한 다음 메시지의 내 목록으로 돌아갑니다 뒤로 버튼을 눌러 전송을 클릭
. 이전과 동일한 화면을 표시합니다 (마지막으로 보낸 메시지가 업데이트되지 않음). 앱을 다시 시작하면 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;
}
}
};
당신은 단순히 onBackPressed를 오버라이드 (override)를해야한다(). 그런 다음 해당 메소드에서 필요한 업데이트를 수행 할 수 있습니다. – Shadesblade
그걸 시도해 보니 onBackPressed 메소드가 사용되지 않는다고합니다. 이것이 조각이라는 것이 중요합니까? 내가 달릴 때도 오류가 발생합니다. 오류 : (67, 5) 오류 : 메소드가 상위 유형의 메소드를 대체하거나 구현하지 않습니다. – Adilp
프래그먼트를 호출하는 Activity에서 onBackPressed를 대체합니다. – Shadesblade