본문 바로가기
Android

[Android/Java] JsonAPI 데이터 화면에 출력하기

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

저번에 NewsData들을 Log찍어봤을때 잘 들어오는것을 확인했다

이제 이 데이터를 NewsAdapater에서 화면에 보여주는 기능을 만들거다

 

 

 


 

 

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);
}

Holder에 들어있는 위의 세가지 값을 데이터를 세팅하는 onBindViewHolder에서 세팅하겠다

 

 

 


 

 

 

@Override
public void onBindViewHolder(@NonNull NewsViewHolder holder, int position) {
    //holder.textView_title.setText(newsDataset[position]);
}

Adapter의  onBindViewHolder 함수는 원본의 크기만큼 반복한다

 

매개변수 position -  리사이클러뷰의 항목 ○번째 = 데이터의 ○번째

 

 

 

position이 있어서 List형태의 newsDataset.get을 통해 특정 순번의 데이터를 가져올 수 있다.

 

 

holder.textView_title.setText(newsDataset.get(position).getTitle());

하나정도 데이터를 가져올거면 이렇게 해도 되지만

 

NewsData news = newsDataset.get(position);
holder.textView_title.setText(news.getTitle());
holder.textView_content.setText(news.getContent());

먼저 position번째의 데이터를 news라는 이름으로 정의하고 그 news에서 필요한 데이터를 가져오게해도 좋다

 

 

 

 


 

 

 

 

Image는 저번에 dependencies에 추가한 Fresco를 이용해 불러올건데

기존에 안드로이드에 있는 ImageView가아닌 SimpleDraweeView를 사용하면 된다

 

 

public NewsAdapter(List<NewsData> myDataset){
    newsDataset = myDataset;
    Fresco.initialize(this);
}

어댑터 첫 함수에 Fresco를 초기화한다

이때, this에서 context 오류가 나는데 Adapter에서는 context를 쓸 수 없기때문에!!!!!!!

 

adapter = new NewsAdapter(news, NewsActivity.this);

Activity로 가서 adpater선언한 코드를 다음과 같이 수정해주고

 

public NewsAdapter(List<NewsData> myDataset, Context context){
    newsDataset = myDataset;
    Fresco.initialize(context);
}

 

Adapter에서 이렇게 context를 사용하면된다 ( 간단하지만 나중에 누수가 생길수있어 이 방법은 권장 x )

 

 

 


 

 

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/imageView_title"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

xml파일로 가서 기존의 ImageView를 SimpleDraweeView로 바꾸고

 

 

Uri uri = Uri.parse(news.getUrlToImage());
holder.imageView_title.setImageURI(uri);

이미지 로딩 코드를 Adapter의 onBindViewHolder에 넣는다

( 기존의 전역변수와 NewsViewHolder에 정의한 imageView를 수정해야한다 )

 

 

 


 

 

@Override
public int getItemCount() {
    return newsDataset == null ? 0 : newsDataset.size();
}

getItemCount는 null일때 오류가 발생할 수 있어서 삼항연산자로 작성했다

null이 아닐경우 newsDataset의 size만큼된다!!

 

 

 

반응형