본문 바로가기
Android

[Android/Java] RecyclerView & Adapter 사용

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

순서

라이브러리 다운 -> RecyclerView 컴포넌트 붙이기 

-> 액티비티와 연결하기 -> 어댑터 연결하기

 


 

RecycleView를 사용하기 위해 필요한 xml

<?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="match_parent"
    android:orientation="vertical"
    android:paddingLeft="12dp"
    android:paddingRight="12dp"
    android:paddingTop="12dp">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerview"
        android:scrollbars="vertical"/>

    </LinearLayout>


1. RecyclerView 화면을 보여줄 액티비티 xml파일

 

 

 



<?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="match_parent"
    android:orientation="vertical"
    android:paddingLeft="12dp"
    android:paddingRight="12dp"
    android:paddingTop="12dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="100dp">

        <ImageView
            android:id="@+id/imageView_title"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="@null"
            android:src="@drawable/ic_launcher_foreground"/>

        <TextView
            android:id="@+id/textView_title"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:text="text_area"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:textSize="20sp"
            android:gravity="center"
            android:background="#70000000"
            android:textColor="#ffffff"
            android:textStyle="bold"
            android:layout_alignParentBottom="true">
        </TextView>

    </RelativeLayout>

    <TextView
        android:id="@+id/textView_content"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="text_area"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:textSize="12sp"
        android:ellipsize="end">
    </TextView>
    </LinearLayout>


2. RecyclerView의 리스트의 항목을 보여줄 xml파일 ( 각 아이템 하나씩 )

 

Adapter의 onCreateViewHolder 함수에 작성한다

 

나는 imageView_title와 첫 textView_title을 겹치게 하기 위해

RelativeLayout으로 한번 더 감싸줬다.

 

 


 

 

라이브러리 다운

implementation 'androidx.recyclerview:recyclerview:1.3.0-alpha01'

build.gradle (:app) -> dependencies { 안에 추가하는데 다른 버전들은 

Android 개발자 공식 홈페이지에서 확인하자

https://developer.android.com/guide/topics/ui/layout/recyclerview#java

 


RecyclerView 컴포넌트 붙이기

 

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerview"
        android:scrollbars="vertical"/>

액티비티와 연결하기

 

위의 xml파일과 연결한다

public class NewsActivity extends AppCompatActivity {

    private RecyclerView recyclerview;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    
    String[] myDataset={"1","2"}; // 1,2 테스트
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
        recyclerview = findViewById(R.id.recyclerview);

        recyclerview.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        recyclerview.setLayoutManager(layoutManager);

        adapter = new NewsAdapter(myDataset);
        recyclerview.setAdapter(adapter);
    }
}

어댑터 연결하기

위와 같이 setAdapter한 adapter를 구현

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {
    private String[] newsDataset;


    // 2. 그 안의 요소를 찾아가는 ViewHolder Class
    protected static class NewsViewHolder extends RecyclerView.ViewHolder{

        public TextView textView_title;
        public TextView textView_content;
        public ImageView imageView_title;

        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);
        }
    }
    public NewsAdapter(String[] myDataset){
        newsDataset = myDataset;
    }

    // 1. RecyclerView의 항목화면 연결은 onCreateViewHolder함수
    @Override
    public NewsAdapter.NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

        // 특정한 컴포넌트 ( 여기서는 리사이클러 뷰 )의 특정 항목의 레이아웃을 바꾸는 inflate
        LinearLayout v = (LinearLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.row_news, parent, false);
        NewsViewHolder vh = new NewsViewHolder(v);

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

    @Override
    public int getItemCount() {
        return newsDataset.length;
    }

}

흐름 정리

 

---Activity에서---

String[] myDataset={"1","2"};

String[] myDataset = 값들

 

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);
    recyclerview = findViewById(R.id.recyclerview);

    recyclerview.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(this);
    recyclerview.setLayoutManager(layoutManager);
adapter = new NewsAdapter(myDataset);
recyclerview.setAdapter(adapter);

adapter = new NewsAdapter(myDataset)

recyclerview.setAdapter(adapter)

 

Adapter로 넘기고,

 

 

 

---Adapter에서---

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {
    private String[] newsDataset;


    // 2. 그 안의 요소를 찾아가는 ViewHolder Class
    protected static class NewsViewHolder extends RecyclerView.ViewHolder{

        public TextView textView_title;
        public TextView textView_content;
        public ImageView imageView_title;

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

사용할 값을 ViewHolder에 정의하고

 

 

public NewsAdapter(String[] myDataset){
    newsDataset = myDataset;
}

생성자를 정의하고

 

 

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

생성자에서 받아온 값을 onBindViewHolder에서 사용한다 ( newsDataset )

반응형

'Android' 카테고리의 다른 글

[Android/Java] Volley + JsonAPI사용  (0) 2022.01.11
[Android/Java] CardView, Json 사용하기  (0) 2022.01.07
[Android/Java] Design lib  (0) 2022.01.04
[Android/Java] Intent 사용  (0) 2022.01.04
[Android/Java] Git연동과 findViewById 에러  (0) 2022.01.04