현재 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" ;
StringRequest request = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
parsingCommentModel(response, curPos);
println( "통신성공 in requestCommentList: " + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
println( "에러 발생 in requestCommentList: " + error );
}
}
);
request.setShouldCache( false );
AppHelper.requestQueue.add(request);
}
|
파싱하는 함수입니다.
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));
}
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보내는 코드입니다.
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) {
}
}
) {
@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를 받아와 앱의 화면을 갱신하는 방법이
괜찮은 방법인가요?