1. 댓글 목록 ListView height 조절

- ScrollView 안에 모든 요소를 넣고 그 중에서 ListView가 있는 구조인데 ListView만 스크롤이 되고 전체 ScrollView는 스크롤이 되지 않는 상태였음

- ListView의 각 item들의 높이를 지정하는 코드를 적용하여 현재는 전체 ScrollView가 스크롤되도록 수정함

- 주의할 점은 firebase DB에서 데이터를 다 읽어온 다음에 height 계산을 해야 제대로 적용된다는 점!!

- https://hayarain.tistory.com/7 해당 포스팅을 참고함

private static void listViewHeightSet(BaseAdapter listAdapter, ListView listView){
    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++){
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }
 
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

 

2. 데이터 추가/삭제 후 기존 데이터가 중복 출력되는 문제 해결

- firebase의 DB에서 데이터를 가져오는데 데이터가 변경되고 난 후에 기존 데이터가 중복 출력되는 문제가 있었음

- 데이터가 변경되면 adapter의 ArrayList를 clear()로 비운 다음에 다시 데이터를 받아오도록 해서 문제 해결

 

3. 댓글 작성 완료 시 키보드 내리기, 댓글창 비우기

- 댓글 등록 기능은 어제 구현했는데 등록되고 나서 키보드가 닫히지 않고 그대로 있었음

- https://sharp57dev.tistory.com/15 해당 포스팅을 보고 참고함

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

EditText input = (EditText)findViewById(R.id.input)
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);	//키보드 내리기

 

4. 댓글 삭제 기능 구현

- CommentAdapter.java에서 각 item의 삭제 버튼에 onClickListener을 추가함

- PostContent.java에서 댓글 삭제할지 다이얼로그를 띄운 후, 네 버튼이 클릭되면 firebase DB에서 삭제하도록 함

 

5. 게시글 최신순 정렬

- 기존에는 가장 오래된 게시글부터 출력되었는데 일반적인 게시판처럼 최신순으로 정렬해야겠다고 생각함

- PostAdapter.java에서 ArrayList에 item을 추가할 때 인덱스 0에 추가하도록 코드를 바꿈으로써 해결

    public void addItem(Post item) {
        //items.add(item);	//기존 코드
        items.add(0, item);
    }

 


 

 

ListView(댓글 영역)만 스크롤되는 것이 아니라 ScrollView 전체가 스크롤된 모습이다.

 

 

댓글을 등록하고 나서 키보드가 자동으로 닫히고

기존에 있던 댓글 데이터가 중복 출력되는 문제가 더이상 발생하지 않는 모습이다.

 

 

작성한 댓글의 삭제 버튼을 클릭하면 다이얼로그가 뜨고

댓글 삭제가 완료되면 바로 화면이 업데이트 된다.

 

 

그리고 가장 최근에 작성된 게시글이 게시글 목록 가장 상단에 있는 것을 확인할 수 있다.

 

이렇게 게시판 주요 기능은 구현을 마쳤다.

익명게시판의 경우 댓글이 없는 대신 공감 기능을 넣을 예정인데

아직 앱 자체에 로그인 기능을 구현하지 않아서 지금은 건드리기 애매한 부분이다.

따라서 게시판 기능은 여기서 마무리하고 나중에 로그인을 구현하고 나서 다시 다룰 예정이다.

1. 게시글 내용 페이지

- 게시글 목록 불러오는 것까지 구현했었는데 이제 각 게시물 카드를 터치했을 때 게시글 세부 내용을 확인하는 페이지로 이동하도록 추가함

2. 게시글 수정 및 삭제

- 작성한 게시글 내용을 수정, 삭제해서 DB에 반영하는 기능을 구현함

3. 댓글 등록

- 게시글에 대한 댓글을 작성할 수 있음

4. 댓글 목록 조회

- Comment.java (model) 과 CommetAdapter.java (viewmodel)을 만듦 (일기 목록, 게시글 목록과 유사한 방식으로 구현)

- 어댑터를 ListView에 연결해서 댓글 목록을 불러오도록 함

 

 

게시글 내용 페이지는 게시글 내용과 댓글 목록, 댓글 입력 부분으로 구성되어있다.

 

문제는 전체를 ScrollView에 넣고 그 중 댓글 목록을 ListView에 넣었는데

ScrollView 자체는 스크롤이 안되고 ListView만 스크롤이 되고 있다...

테스트로 작성한 글은 내용이 짧기 때문에 얼핏 괜찮아보이지만

글 내용이 길어지면 댓글이 나오는 영역이 많이 줄어들기 때문에

이 부분을 어떻게 해결할 수 있을지 더 찾아보아야 한다.

 

 

게시글 수정 및 삭제 기능을 이용할 수 있다.

 

아직은 앱 로그인 기능을 구현하지 않아 수정/삭제 권한을 따로 부여하지 않은 상태인데

나중에 로그인을 구현하고 나서 이 부분을 많이 수정해야할거 같다.

 

 

게시글에 대한 댓글 작성도 가능한데

등록 버튼을 클릭하면 키패드가 닫히도록 수정해야한다.

현재는 등록 버튼을 클릭해도 키패드가 그대로 열려있는 상태이다.

 

그리고 게시글 작성/댓글 작성 후에 출력되는 목록에 버그가 있는데

(기존에 있던 목록) + (기존에 있던 목록) + (새로 추가한거)

이렇게 데이터가 중복돼서 출력되는 현상이다.

로직 실행 순서에 문제가 있는건지 잘 모르겠다.

이것도 구글링을 더 해봐야할듯

 

그래도 오늘 하루만에 CRUD를 모두 다뤄서 뿌듯하다.

1. 게시판 Fragment화

앱에는 자유게시판과 익명게시판, 2개의 게시판이 존재한다.

 

그런데 기존 코드는 자유게시판/익명게시판 버튼을 터치할 때마다

새로운 Intent를 만들어 페이지 이동을 해서 Intent가 스택처럼 계속 쌓여나갔다.

 

이 점이 비효율적이라고 생각해서 Intent 대신 Fragment를 이용해서

한 Intent에서 자유게시판/익명게시판 Fragment를 호출하여 각 게시판을 이동할 수 있도록 수정했다.

 

 

Firebase DB와 연결하지 않아 실제 게시물 내용이 반영되진 않았지만,

각 게시판에 따라 서로 다른 RecyclerView 내용이 출력되는 것은 확인했다.

 

 

2. 게시글 작성 기능 구현 (DB 데이터 추가)

Firebase DB에 작성한 게시글 데이터를 등록하는 기능을 구현했다.

일기장 기능을 구현하면서 DB에 데이터 추가하는 코드는 작성했었기 때문에

게시글도 그와 유사하게 코드를 작성했다.

 

3. 게시글 조회 기능 구현 (DB 데이터 조회)

DB에서 데이터를 조회하면서 고민할 부분이 2가지가 있었다.

 

첫번째는 Firebase DB가 트리 구조이기 때문에

전체 일기 데이터를 어떻게 불러올 수 있는지 고민되어 찾아보았다.

구글링 한 결과 다음과 같은 코드를 작성했다.

 

freeBoardRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dateSnap: dataSnapshot.getChildren()){
                        for(DataSnapshot snap: dateSnap.getChildren()){
                            Post value = snap.getValue(Post.class);
                            adapter.addItem(new Post(value.title, value.content, value.writer, value.writeDate));
                        }
                    }
            }
            ...
}

 

Firebase Reference에 ValueEventListener을 추가하는데 이때 onDataChange 메소드를 작성했었다.

여기에서 파라미터로 DataSnapshot을 가지는데, for Each문을 중첩해서 사용함으로써

트리 안쪽에 있는 데이터까지 접근할 수 있었다.

 

두번째로 고민된 것은, 자유/익명게시판을 Fragment로 구현해서 그런지

view를 return하는 것보다 DB에서 데이터를 가져오는 것이 더 나중에 실행되는 것이었다.

 

https://t-okk.tistory.com/12

구글링하다가 찾은 위의 포스팅을 참고하여 구현했다.

 

결과적으로 PostAdapter.java에 작성했었던 setItems와,

public void setItems(ArrayList<Post> items){
        this.items = items;
    }

 

포스팅에서 참고한 adapter.notifyDataSetChanged(); 를 이용했다.

 

1. 게시판 게시물 목록 구현 (RecyclerView 이용)

구현 방법

1) 기존 화면에 RecyclerView 태그 추가

2) 게시물.java 생성 <- 속성, 생성자, Get/Set 함수 생성

3) 게시물_item.xml 생성

  -현재는 CardView 사용, 추후에 레이아웃 수정할 예정

4) 게시물Adapter.java 생성

5) 기존 화면 관련 java 파일에 코드 추가

  -setLayoutManager, 게시물Adapter 이용

 

2. 자체 테스트 문항 목록 구현 (RecyclerView 이용)

구현 방법은 게시판과 동일함

 

3. 마이페이지 레이아웃 수정

-스마트폰 화면 크기와 상관 없이 화면에 내용이 꽉 차도록 수정

+ Recent posts