저번에 만들었던 간단한 news앱을 클릭했을때 본문 전체보기 만들기를 할거다
private static View.OnClickListener onClickListener;
Adapter에서 전역변수로 OnClickListener를 선언해주고,
( 아래에서 설명하듯 staic class 안에있는 ViewHolder안에서 사용할거라static해준다 )
public NewsAdapter(List<NewsData> myDataset, Context context, View.OnClickListener onClick){
newsDataset = myDataset;
onClickListener = onClick;
Fresco.initialize(context);
}
Adapter에 onClickListener를 다음과 같이 선언해주면
ViewHolder와 onVindViewHolder에서 사용할 수 있다.
v.setClickable(true); // 누를 수 있다
v.setEnabled(true); // 활성화 상태
v.setOnClickListener(onClickListener);
onBindViewHolder안에서 리스너를 사용하면 position때문에 간편하지만
실행 후 계속 뺑뺑이(?)돌기 때문에 ViewHolder에서 리스너를 사용하겠다
public NewsViewHolder(View v){
super(v);
// Activity가 아니라 부모로 정한 Linerlayout v 라고 정의한 v에서 findViewById로 값을 가져와야 함
textView_title = v.findViewById(R.id.textView_title);
textView_content = v.findViewById(R.id.textView_content);
imageView_title = v.findViewById(R.id.imageView_title);
rootView = v;
v.setClickable(true); // 누를 수 있다
v.setEnabled(true); // 활성화 상태
v.setOnClickListener(onClickListener);
}
ViewHolder에 rootView를 v라고 정의!
setClickable, setEnabled,
onClickListener를 설정!!
//tag
holder.rootView.setTag(position);
onBindViewHolder안에는 이 rootView로 tag(label)만 달아주면 된다!!!!
그럼 이렇게 Activity에서 adapter 선언 부분에
ClickListener를 안넘겼으니 빨간줄이 발생한다.
adapter = new NewsAdapter(news, NewsActivity.this, new View.OnClickListener() {
@Override
public void onClick(View view) {
if(view.getTag() != null){
int position = (int)view.getTag(); // null인데 int로 형변환하면 예외발생
}
}
});
recyclerview.setAdapter(adapter);
View.OnClickListener를 매개변수에 넣어주고
getTag를 넣어주는데 Object라서 null체크를해주고 position은 int였으니
int로 형변환을 해준다 ( position = Adapter의 position )
public NewsData getNews(int position){
return newsDataset == null? null : newsDataset.get(position);
}
Adapter에서 그 position의 newsDataset을 가져오는 함수를 하나 만든다
adapter = new NewsAdapter(news, NewsActivity.this, new View.OnClickListener() {
@Override
public void onClick(View view) {
if(view.getTag() != null){
int position = (int)view.getTag(); // null인데 int로 형변환하면 예외발생
((NewsAdapter)adapter).getNews(position);
Intent intent = new Intent(NewsActivity.this, ContentActivity.class);
startActivity(intent);
}
}
});
Adapter에 선언한 getNews함수는 데이터타입이 RecyclerView.Adapter로 되어있어서
위와같이 NewsAdapter로 형 변환한 후 getNews함수를 사용해야한다.
이제 ContentActivity에서 상세 뉴스를 보여주는 코드를 만들면 끝!
'Android' 카테고리의 다른 글
[Android/Java] Activity - Fragment간 화면전환 (0) | 2022.01.20 |
---|---|
[Android /Java] setOnNavigationItemSelectedListener depercated (0) | 2022.01.20 |
[Android/Java] JsonAPI 데이터 화면에 출력하기 (0) | 2022.01.14 |
[Android/Java] Volley + JsonAPI사용 (0) | 2022.01.11 |
[Android/Java] CardView, Json 사용하기 (0) | 2022.01.07 |