본문 바로가기
Android

[Android/Java] Adapter에서 클릭이벤트, 태그달기

by noddu 2022. 1. 15.
728x90
반응형

저번에 만들었던 간단한 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에서 상세 뉴스를 보여주는 코드를 만들면 끝!

반응형