본문 바로가기

개발 일기/Android

[Kotlin] 간단 메모장 만들기 6 #Glide #Obseve

일단 이미지 스키마를 만들었다.

 

WriteImage.tk

 

@Entity(tableName = "write_image")
data class WriteImage(
    @PrimaryKey(autoGenerate = true)
    val _id: Int?,

    @ColumnInfo(name = "diary_id")
    val diary_id: Int?,

    @ColumnInfo(name = "name")
    val name: String?,

    @ColumnInfo(name = "count")
    val count: Int?
)

그리고 메인에서 LiveData를 Observe 하는데 거기서 Diary 뿐만 아니라 WriteImag 도 Observe 하게 변경해 주었다.

그러면 사진이 삭제되어도 변경되고 글이 변경되어도 바뀌기 때문이다.

 

MainFragment.tk

 

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val recyclerView = MainFragment_RecyclerView_view
        val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        //diary와 writeImage 둘다 확인해야함.
        viewModel.getAll().observe(this.viewLifecycleOwner, Observer { diary ->
        	//여기 추가!!
            viewModel.getAllWriteImage().observe(this.viewLifecycleOwner, Observer { writeImage ->
                recyclerView.adapter = MainDiaryAdapter(diary, writeImage, this.context!!)
            })
        })
    }
}

 

MainDiaryAdapter.kt

 

class MainDiaryAdapter(
    private val diary: List<Diary>,
    private val writeImages: List<WriteImage>,
    private val context: Context
) : RecyclerView.Adapter<MainDiaryAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
       ...
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = diary[position]
        for (writeImage in writeImages) {
            //count가 0인 것만 보여줌
            if (writeImage.diary_id == item._id && writeImage.count == 0) {
                //이미지 name의 주소 가져옴
                val path =
                    context
                    .getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!
                    .path 
                    + "/" 
                    + writeImage.name
                //gilde로 이미지 보여줌
                Glide.with(context).load(path).into(holder.imageView)
                holder.imageView.visibility = View.VISIBLE
                break
            }
        }
        ...
    }

    override fun getItemCount(): Int = diary.size

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        ...
    }
}

 

아마 더 좋은 방법이 있을 것이다... 이 방법은 무식하게 그냥 모든 이미지를 가져와서 id를 비교하기 때문에 나중에는 디비에서 골라서 가져오도록 해야 한다.

 

여기서는 path를 가져오는 방법만 알아가도록 하자. Write에서 저장한 이미지 path를 가져와 거기에 내 DB에 저장된 이름을 넣어 이미지가 저장된 경로와 파일 이름을 합쳐서 Glide에 넣어주면 알아서 가져와 View에 보여준다. Glide는 아주 편하다. 꼭 써보자!!

 

메인에 이미지 가져오기 완료!!

 

다음엔 메인 클릭 시 게시글을 보는 화면을 구현해보겠다.