코드는 Github
레이아웃 xml 파일은 코드를 참고
앞 포스팅과 마찬가지로 Firebase를 이용해서 구현할 것 이다.
ReviewActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_review);
final Intent intent = getIntent();
final String userid = intent.getStringExtra("USERID");
// database를 이용해 리사이클러뷰 구현 부분
mRecyclerView = findViewById(R.id.review_view) ;
mRecyclerView.setHasFixedSize(true); // 리사이클러뷰 기존 성능 강화
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // 리사이클러뷰에 LinearLayoutManager 지정. (vertical)
Button btn_update = findViewById(R.id.update_review);
btn_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
database = FirebaseDatabase.getInstance(); // firebase 데이터베이스 연동
databaseReference = database.getReference("게시판"); // DB 테이블 연결
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// firebase 데이터베이스의 데이터를 받아오는 곳
mList.clear(); // 기존 배열리스트가 존재하지않게 초기화
for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // 반복문으로 데이터 List를 추출해냄
Review info = snapshot.getValue(Review.class); // 만들어뒀던 객체에 데이터를 담는다.
mList.add(info); // 담은 데이터들을 배열리스트에 넣고 리사이클러뷰로 보낼 준비
}
mAdapter.notifyDataSetChanged(); // 리스트 저장 및 새로고침
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
// 디비를 가져오던 중 에러 발생 시
Log.e("ReviewActivity", String.valueOf(error.toException())); // 에러 출력
}
});
// 리사이클러뷰에 Adapter 객체 지정.
mAdapter = new ReviewAdapter(mList);
mRecyclerView.setAdapter(mAdapter);
}
});
// main으로 돌아가는 부분
Button btn_main = findViewById(R.id.go_main2);
btn_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_OK, intent);
finish();
}
});
// 글쓰기 액티비티로 넘어가는 부분
Button btn_write = findViewById(R.id.write_review);
btn_write.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent write_intent = new Intent(getApplicationContext(), WriteActivity.class);
write_intent.putExtra("ID", ""+userid); // ID 보내주기
startActivity(write_intent);
}
});
}
...
}
리사이클러뷰를 연동하는 것까지는 앞에서 했던 것과 똑같다.(설명 생략)
글쓰기 액티비티로 넘어갈 때 유저 ID를 가지고 간다.
WriteActivity
public class WriteActivity extends AppCompatActivity {
private FirebaseDatabase database;
private DatabaseReference databaseReference;
String ID;
public class Write {
public String id;
public String title;
public String content;
public Write(String id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write);
final Intent intent = getIntent();
ID = intent.getStringExtra("ID");
Button btn_upload = findViewById(R.id.upload);
btn_upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText text_title = findViewById(R.id.id_etx);
EditText text_content = findViewById(R.id.rating_etx);
Write w = new Write(ID, text_title.getText().toString(), text_content.getText().toString());
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference();
databaseReference.child("게시판").child(ID).setValue(w);
finish();
}
});
}
}
Write 생성자에 ID
와 Title
, Content
를 넣고 databaseReference.child("게시판").child(ID).setValue(w)
를 이용해서 게시판 데이터 베이스에 ID를 따서 저장해준다.
따라서 ID에 따라 후기를 작성할 수 있고 해당 ID로 후기를 작성한 적이 없으면 데이터를 만들어주고 만약 작성한 적이 있다면 해당 데이터를 수정하는 방식이다.
요런식으로 자신의 ID에 저장된다.
01은 그냥 임의로 설정해둔 것
결과화면
내용은 대충 아무말이나 적었다..ㅎㅎ
로그인 후 지도 창에서 선택한 지역을 스피너의 초기값으로 설정해주도록 했다.
로그인 액티비티에서 홈 액티비티로 보내주고 홈 액티비티에서 스피너 값을 설정해준 다음 메인 액티비티로 index값을 보내주었다.
MainActivity
// 로그인 인텐트 부분 삭제
// Home 인텐트 부분 추가
Intent intent = getIntent();
final String id = intent.getStringExtra("USER_ID"); // id가져오기
int pos = intent.getIntExtra("INDEX", 0); // 스피너 index 가져오기
...
//스피너 부분
spinner.setSelection(pos); // 스피너 default 값 설정
setSelection
을 이용해 초기 값을 설정해준다.
HomeActivity
public class HomeActivity extends AppCompatActivity implements View.OnClickListener {
String id;
private TextView[] view_list = new TextView[17];
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//로그인에서 넘어옴
Intent intent = getIntent();
id = intent.getStringExtra("ID"); // id가져오기
Toast.makeText(getApplicationContext(), " 로그인 성공!", Toast.LENGTH_SHORT).show();
// 메인으로 이동 인텐트 (클릭 뷰 이름 바꿔줘)
view_list[0] = findViewById(R.id.tv_seoul);
view_list[1] = findViewById(R.id.tv_Busan);
view_list[2] = findViewById(R.id.tv_Daegu);
view_list[3] = findViewById(R.id.tv_Incheon);
view_list[4] = findViewById(R.id.tv_Gwangju);
view_list[5] = findViewById(R.id.tv_Daejeon);
view_list[6] = findViewById(R.id.tv_Ulsan);
view_list[7] = findViewById(R.id.tv_Sejong);
view_list[8] = findViewById(R.id.tv_Gyeonggi);
view_list[9] = findViewById(R.id.tv_Gangwon);
view_list[10] = findViewById(R.id.tv_Chungbuk);
view_list[11] = findViewById(R.id.tv_Chungnam);
view_list[12] = findViewById(R.id.tv_Jeonbuk);
view_list[13] = findViewById(R.id.tv_Jeonnam);
view_list[14] = findViewById(R.id.tv_Gyeongbuk);
view_list[15] = findViewById(R.id.tv_Gyeongnam);
view_list[16] = findViewById(R.id.tv_Jeju);
// 클릭리스너 등록 및 클릭시 가져올 index 저장
for(int i=0 ; i<17 ; i++) {
view_list[i].setTag(i); // 배열에서의 index를 태그로 저장
view_list[i].setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
TextView choice = (TextView) v; // 클릭된 뷰를 가져온다.
for(TextView tempView : view_list) {
if(tempView == choice) {
int pos = (Integer)v.getTag();
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra("USER_ID", ""+id); // ID 보내주기
intent.putExtra("INDEX", pos);
startActivity(intent);
finish();
}
}
}
}
클릭 이벤트 17개를 전부 써주면 매우 비효율적이기 때문에 리스트에 클릭 리스너를 등록 후 index를 tag로 저장해두고 해당 뷰가 클릭되었을 때 뷰에 맞는 index를 인텐트로 보내는 방식으로 구현했다.
(public class HomeActivity extends AppCompatActivity
이후에 implements View.OnClickListener
해줘야함)
혹시 git 에 소스가있으시다면 깃 주소를 좀 공유받을수있을까요