현재 API에서 리뷰 데이터를 받아와 앱화면에 표시해주고 있습니다.
거기에 제가 작성한 리뷰데이터를 서버(API)에 저장하고 이 저장한 데이터를 실시간으로 다시 갱신하고
싶습니다.
즉, 동작을 간단하게 적어보자면 현재 리뷰 코멘트들은
1. readComment라는 API 서버에서 불러오고 있습니다.
2.작성하기를 통해 작성한 리뷰는 createComment라는 서버에 양식?에 맞춰 보냅니다.
여기 보낸 리뷰들은 readComment 서버에 json형식으로 표시됩니다.
3. 서버는 volley를 사용하고 데이터를 불러올때는 json을 gson으로 파싱해 아이템에 세팅합니다.
이 리뷰가 보이는 화면에서 리뷰는 현재 API 서버에 요청해 저장된 리뷰들을 받아온것입니다.
리뷰는 리사이클러뷰로 되어있습니다.
여기서 작성하기 버튼을 누르면

리뷰작성화면으로 이동하게되는데, 리뷰를 저장하면 이전 화면에서 실시간으로 아이템을 업데이트 하고 싶습니다
저장버튼을 누르면 이제 데이터를 전송을해야하는데, 어떻게 업데이트 시킬지 2~3가지 방법을 생각
했습니다.
1.작성하기 화면을 띄울때 startActivityForReseult()를 사용해서 작성하기 액티비티가 종료 될때, intent에 작성된 내용과, 평점등을 따로 저장해 호출한 액티비티로 보내 거기서 아이템에 받은 데이터들을 세팅후 리사이클러뷰 아이템에 추가한후 notifyDatasetChanged() 한다. 물론 데이터는 서버쪽으로 보내지고 다음번에 새로 시작하면 작성한 리뷰가 추가되어 화면에 보인다.
2.마찬가지로 startActivityForResult()를 사용하지만 onActivityResult()에서 다시 서버를 요청하고 데이터를 파싱하는 함수를 호출해서 데이터를 세팅한다...
두가지 방법을 생각했지만 1번의 경우 API를 이용해서 세팅한다는 취지와는 좀 거리가 먼것같아
일단은 2번을 사용했는데요..2번을해도 데이터,,그러니까 아이템이 갱신되지 않습니다..어떤점에 문제일까요?
한줄평 목록을 받아오는 코드입니다.
// 서버요청(요청객체만들기) 및 한줄평 목록 받아오기
public void requestCommentList(final int curPos) {
String url = "http://" + AppHelper.host + ":"+ AppHelper.port + "/movie/readCommentList";
url += "?" + "id=" + curPos + "&startindex=1&length=10"; // 요청 파라미터, 현재 페이지에 따른 api 부르기
StringRequest request = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 요청 보내고 정상 응답을 받는곳
parsingCommentModel(response, curPos); // gson으로 파싱하기
println("통신성공 in requestCommentList: " + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
println("에러 발생 in requestCommentList: " + error );
}
}
);
request.setShouldCache(false);
AppHelper.requestQueue.add(request); // 요청큐에 요청객체 넣기
}
파싱하는 함수입니다.
// 받아온 CommentList 응답 gson으로 자바 객체화(파싱) 후 레이아웃에 셋팅
public void parsingCommentModel(String response, int curPos) {
Gson gson = new Gson();
ResponseInfo info = gson.fromJson(response, ResponseInfo.class);
if(info.code == 200) {
cmArray = gson.fromJson(response, CommentModelArray.class);
for(int i=0; i<cmArray.result.size(); i++) {
items.add(cmArray.result.get(i)); // gson으로 파싱된 객체배열을 하나씩 꺼내 items에 넣기
}
ShowOnlyTwoItems();
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
작성한 한줄평을 받아오는 onActivityResult() 입니다.
// 작성한 한줄평 데이터 받아와서 추가하기
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 101) { // 상세보기의 작성하기에서 온 데이터
if(data != null) {
Log.d("onActivityResult", "requestCode : 101");
requestCommentList(curPos); // 다시 서버 호출해서 데이터 세팅하기
}
}
}
작성하고 저장하기 코드입니다.
// 한줄평 저장하기
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String check = write.getText().toString();
// 아무것도 입력하지 않았을때
if (check.equals("")) {
Toast.makeText(getApplicationContext(), "내용을 입력해주세요", Toast.LENGTH_LONG).show();
}
// 내용 저장할때
else {
saveWriteCommentData(id);
final Snackbar sb = Snackbar.make(wc, "저장 완료", Snackbar.LENGTH_INDEFINITE).setDuration(5000);
// 스낵바가 올라오고 사라진걸 알수 있는 콜백함수
sb.addCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
finish();
}
});
sb.show();
}
}
});
작성한 내용을 createComment 서버에 저장 및 호출한 액티비티에 intent보내는 코드입니다.
// 서버요청(요청객체만들기) 및 한줄평 서버에 저장하기 (POST 방식)
public void saveWriteCommentData(final int curPos) {
String url = "http://" + AppHelper.host + ":"+ AppHelper.port + "/movie/createComment";
StringRequest request = new StringRequest(
Request.Method.POST,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
ResponseInfo info = gson.fromJson(response, ResponseInfo.class);
if(info.code == 400) {
Log.d("saveWriteCommentData", "호출확인 ");
Intent intent = new Intent();
intent.putExtra("Infocode", Integer.toString(400)); // 별의미없는 보냄확인용 코드
setResult(RESULT_OK, intent);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
) {
// createComment에 보내면 readComment에 표시됨
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
f_rating = rating.getRating();
params.put("id", Integer.toString(curPos));
params.put("writer", "안드슬레이브");
params.put("rating", f_rating.toString());
params.put("contents", write.getText().toString());
Log.d("getParams() in WC.java", "getParams 호출확인 ");
return params;
}
};
request.setShouldCache(false);
AppHelper.requestQueue.add(request); // 요청큐에 요청객체 넣기
}
조금 긴것같지만 좀 도와주시면 감사하겠습니다..
저는 저장한 내용을 서버에 보내고 다시 서버를 요청하고 호출하고 리사이클러뷰의
notifyDatasetChanged를 호출하면 갱신될것같았지만 아무런 반응이 없네요..ㅜㅜ
로그를 찍어보니 호출될건 다 호출되는것 같은데..뭐가문제일까요?ㅜ
그리고 제가하는 방법..그러니까 서버를 다시요청하고 다시 api를 받아와 앱의 화면을 갱신하는 방법이
괜찮은 방법인가요?