Term project 진행(5. 후기 게시판)

김영한·2020년 12월 14일
0

Festival_List_App

목록 보기
5/5

코드는 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 생성자에 IDTitle, 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 해줘야함)


📢 전체적인 레이아웃과 데모 버전



3개의 댓글

comment-user-thumbnail
2023년 3월 27일

혹시 git 에 소스가있으시다면 깃 주소를 좀 공유받을수있을까요

1개의 답글