Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

며칠 동안 혼자 끙끙대가 도저히 해결이 안되어서 올립니다. #6

Open
doqsa opened this issue Jan 14, 2019 · 4 comments

Comments

@doqsa
Copy link

doqsa commented Jan 14, 2019

No description provided.

@doqsa
Copy link
Author

doqsa commented Jan 14, 2019

리사이클러 뷰 어댑터에서 resources에 접근해서 데이타를 읽고 싶은데
방법을 몰라서 아래와 같이 init에서 데이타를 대입합니다.

class BasicTitleAdapter: RecyclerView.Adapter<BasicTitleAdapter.ViewHolder>() {
var basic_title_array: Array
init {
basic_title_array =
arrayOf(
"000. 시 작"
,"001. 자동차"
,"002. 기 차"
,"003. 비행기"
)
}

혹시 리소스에 접근해서 getStringArray(R.array.basic_title_array)
로 스트링 어레이를 읽어낼 수 있을까요?

13장을 하다가 RecyclerView를 사용하는 방법을 쓰다 보니까
여기서 막히네요.
별별짓을 해봤어요.
Application...., Resource ... 등등 써 봤지만 에러만 나요.

결국 뷰 어뎁터에서 Activity의 리소스를 불러야할 것 같은데 방법을 모르겠어요.
부탁합니다. ㅋ

@junsuk5
Copy link
Owner

junsuk5 commented Jan 14, 2019

리소스를 읽어 오려면 Context 를 통해야 하는데요 Activity 는 Context를 상속 받아서 그 자체가 Context입니다.
그래서 액티비티 내에서는 getStringArray등이 그냥 호출 되는데 RecyclerView.Adapter 안에서는 리소스에 접근하는 메서드 호출이 되지 않지요.
따라서 context 객체를 통해서 리소스에 접근하면 됩니다.

일반적으로 onCreateViewHolder 또는 onBindViewHolder에서 리소스에 접근할 일이 있을텐데 아래와 같이 사용하시면 됩니다.

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TitleViewHolder {
    // parent.context 사용하시면 됩니다.
    parent.context.getStringArray( )      // ok
}
...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    // holder.starTextView.context 모든 뷰는 Context를 가지고 있습니다. 이걸 사용하세요.
    holder.starTextView.context.getStringArray( )      // ok
}

애초에 어댑터의 생성자에 Context를 전달하여 Field로 가지고 있는 방법도 있는데 저는 위와 같은 방법을 주로 사용합니다.
https://stackoverflow.com/questions/32136973/how-to-get-a-context-in-a-recycler-view-adapter 참고

@doqsa
Copy link
Author

doqsa commented Jan 14, 2019

역시 코틀린의 대가시군요 ㅎ
context라는 것이 있었네요. 점점 개념이 어려워지는 것 같아요 ㅋ
그래도 자바보다는 쉬운것 같습니다.
자바는 포기했는데 코틀린은 나름 재미가 있어요.ㅋ

adapter에서 데이타를 읽으려니까. 이런 문제가 발생하는 것 같아서
main activity에서 데이타를 읽어서 adapter 인자로 string array를 넘겨주는 방법으로
시도하려고 합니다.

@doqsa
Copy link
Author

doqsa commented Jan 14, 2019

onCreateViewHolder 나 onBindViewHolder를 쓰면 item수만큼 실행이 되더라고요.
제 프로그램하고는 안맞는 것 같아서 세번째 방법을 써봤어요.

아래처럼 어뎁터에 현재의 context인 this를 인자로 넘기고
rv_basic_title.adapter = BasicTitleAdapter(this )

아래처럼 어뎁터에서 받은 다음
class BasicTitleAdapter(context: Context): RecyclerView.Adapter<BasicTitleAdapter.ViewHolder>() {

변수에 지정해서 사용하니까
val context = context

결과가 잘 나오네요.

역쉬 굿입니다 ㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants