경험의 기록

2021.05.17 - [안드로이드/AAC, MVVM] - [Android] Retrofit 사용하여 서버와 http 통신하기 - (2) 동적주소, 쿼리 사용하기

 

[Android] Retrofit 사용하여 서버와 http 통신하기 - (2) 동적주소, 쿼리 사용하기

2021.05.14 - [안드로이드/AAC, MVVM] - [Android] Retrofit 사용하여 서버와 http 통신하기 - (1) 기본적인 사용법 [Android] Retrofit 사용하여 서버와 http 통신하기 - (1) 기본적인 사용법 ❓ 레트로핏이란 ▶..

hanyeop.tistory.com

에서 이어지는 글입니다.

 


이번에는 통신한 값들을 리싸이클러뷰에 표현하려고 한다.

 

메인레이아웃 변경

userId를 입력받아 그 결과값들을 출력하기 위해 레이아웃을 만들어준다.

 

리싸이클러뷰 아이템 생성

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="30dp"
    android:layout_margin="10dp"
    android:background="#DFD0D0">

    <TextView
        android:id="@+id/userIdText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_margin="5dp"/>

    <TextView
        android:id="@+id/idText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_margin="5dp"/>

    <TextView
        android:id="@+id/titleText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_margin="5dp"/>

    <TextView
        android:id="@+id/bodyText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_margin="5dp"/>
</LinearLayout>

리싸이클러뷰에서 아이템으로 사용해줄 레이아웃을 만들어준다.

 

 

리싸이클러뷰 어댑터 생성

class MyAdapter
    : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    private var myList = emptyList<Post>()

    class MyViewHolder(val binding: ItemLayoutBinding) : RecyclerView.ViewHolder(binding.root)

    // 어떤 xml 으로 뷰 홀더를 생성할지 지정
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = ItemLayoutBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return MyViewHolder(binding)
    }

    // 뷰 홀더에 데이터 바인딩
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.binding.userIdText.text = myList[position].myUserId.toString()
        holder.binding.idText.text = myList[position].id.toString()
        holder.binding.titleText.text = myList[position].title
        holder.binding.bodyText.text = myList[position].body
    }

    // 뷰 홀더의 개수 리턴
    override fun getItemCount(): Int {
        return myList.size
    }

    // 데이터 변경시 리스트 다시 할당
    fun setData(newList : List<Post>){
        myList = newList
        // 새로고침
        notifyDataSetChanged()
    }
}

리싸이클러뷰에서 사용할 어댑터를 생성해준다.

setData를 메인에서 옵저버패턴으로 호출하여 리스트를 갱신할 것이다.

2021.05.17 - [안드로이드/기본] - [Android] 자주쓰는 RecyclerView 사용하기 (+ ViewBinding)

 

[Android] 자주쓰는 RecyclerView 사용하기 (+ ViewBinding)

RecyclerView 는 안드로이드 개발을 할 때 자주 사용하게 된다. 그런데 만들때마다 조금씩 헷갈릴 때가 있어서, 하나하나 깔끔하게 과정을 정리하여 참고할 수 있는 라이브러리처럼 만들어 보고자

hanyeop.tistory.com

리싸이클러뷰에 대한 자세한 설명은 여기서 확인할 수 있다.

 

메인액티비티

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel : MainViewModel
    private lateinit var binding : ActivityMainBinding
    private val myAdapter by lazy { MyAdapter() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 뷰바인딩
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 어댑터 연결
        binding.recyclerView.adapter = myAdapter
        binding.recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false)

        val repository = Repository()
        val viewModelFactory = MainViewModelFactory(repository)
        viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)

        viewModel.myCustomPosts2.observe(this, Observer {
            if(it.isSuccessful){
                myAdapter.setData(it.body()!!)
            }
            else{
                Toast.makeText(this,it.code(), Toast.LENGTH_SHORT).show()
            }
        })

        // 받아온 값을 리싸이클러뷰에 보여줌
        binding.button.setOnClickListener {
            viewModel.getCustomPosts2(Integer.parseInt(binding.editTextView.text.toString()),"id","asc")
        }
    }
}

버튼클릭시 getCustomPosts2 메소드를 호출하여 myCustomPosts2 값이 바뀌기 때문에

옵저버패턴에 의해 호출되고, 통신이 잘 되었으면 어댑터의 setData에 리스트를 넘겨준다.

 

결과값이 잘 출력되는 것을 확인할 수 있다.

 

https://github.com/HanYeop/AndroidStudio-Practice/tree/master/Retrofit_Test

 

HanYeop/AndroidStudio-Practice

안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.

github.com

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading