View

RecyclerView

제롱구리 2024. 2. 28. 19:19
728x90

#오늘은?

금일은 Calendar를 개발하는 도중이기 때문에 간단히 해당 Calendar에서 사용하는 RecyclerView에 대해서 예제를 사용하면서 간단히 RecyclerView가 무엇인지 알아보자 추후에 Calendar 개발 하면 해당 Calendar에 대해서 포스트하겠당 현재..열심히 공부하면서 개발중...ㅠㅠ(답이 안나온다..ㅇㅅㅇ;)


RecyclerView

프로젝트 이름: RecyclerViewExample

안드로이드의 RecyclerView는 여러 리스트를 묶어서 뷰탄에 보여주는 역할을 합니다.

[정의]

사용자가 관리하는 많은 수의 데이터 집합을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹을 말합니다.


[구성요소]

Adapter: 아이템 뷰들을 생성하고 보여줄 뷰단에 연결하는 역할

Layout Manager: 아이템 뷰가 나열되는 형태의 관리하기 위한 요소

_ViewHoloder: 화면에 표시될 아이템 뷰를 저장하는 객체로 Adapter에 의해 관리되며, 미리 생성된 뷰홀더가 있을 경우 재활용됩니다.

RecycelerView의 가장 큰 특징은 이름에서도 알 수 있듯이 재사용아리는 것입니다. 이것은 뷰단에서 여러 리스트 요소를 가지고 일일이 표현하지 않고 RecyclerView 라는 뷰를 이용하여 묶어주므로써 재사용한다는 것을 의미합니다.


[XML]

RecyclerView를 생성

뷰단에서 RecyclerView의 모양을 만들어줍니다.


[코드]

RecyclerView 변수를 뷰단의 id와 연결

linearLayoutManager = new LinearLayoutManager(this); 를 이용한 레이아웃 메니저객체 생성

recyclerView.setLayoutManager(linearLayoutManager); 를 이용하여 RecyclerView에 아까 생성한 매니저를 설정

리스트들의 묶음이 될 ArrayList생성

mainAdapter의 생성자에 해당 위에 ArrayList를 넣어주므로써 mainAdapter 클래스에서 ArrayList형식으로 레이아웃을

RecyclerView 어댑터에 해당 세팅해서 묶어서 만든 mainAdapter를 setting해주므로써 끝나게 됩니다.

MainActivity

package com.example.recyclerviewexample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ArrayList<MainData> arrayList;
    private MainAdapter mainAdapter;
    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.rv);    //뷰와 연결
        linearLayoutManager = new LinearLayoutManager(this);    //레이아웃 매니저 객체 생성
        recyclerView.setLayoutManager(linearLayoutManager);        //생성한 Recycler뷰에 위에 생성한 매니저 객체를 설정

        arrayList = new ArrayList<>();
        mainAdapter = new MainAdapter(arrayList);
        recyclerView.setAdapter(mainAdapter);

        Button btn_add = (Button)findViewById(R.id.btn_add);
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainData mainData = new MainData(R.mipmap.ic_launcher, "제롱동이", "리사이클러뷰");
                arrayList.add(mainData);
                mainAdapter.notifyDataSetChanged();

            }
        });

    }
}

MainAdapter는 RecyclerView의 한 묶음을 MainData 객체와 메소드를 이용하여 만들어주는 것입니다.

상단에 1번 있는 MainAdapter 클래스의 생성자 부분에서 ArrayayList를 생성자 매개 변수로 넣어줍니다.

2번은 OnclickLinear처럼 해당 어댑터부분에 OncreateView라고 보면 편할 것입니다.

해당 CustomViewHolder holder = new CustomViewHolder(view); 를 이용하여 한 묶음의 Holder 객체를 생성

3번은 MainData를 클래스를 이용하여 각각에 실질적 데이터 값을 한 묶음에 넣어줍니다.

즉 뷰단에서 묶어서 한가지 큰 리스트를 만든 것처럼 이것을 실제 데이터를 넣어서 연결해주는 것입니다.

4번은 해당 ArrayList의 길이값을 나타내어 나중에 필요할대 전제 즉 여러개의 Holder의 갯수를 나타낸다고 봐도 됩니다.

position은 각각의 Holder의 인덱스 번호라 보며 되면 각각의 Holder안에 있는 데이터의 경우 같은 position 즉 인덱스 값을 가지게 됩니다.

간단히 말하자면 0 이라는 인덱스를 가지는 Holder의 경우 Holder 안에 각각의 아이템인 profile, name, content가 모두 0 이라는 같은 인덱스 즉 position값을 가진다고 보면됩니다.

remove의 경우 해당 position의 값을 이용하여 특정 holder를 지우는 것입니다.

맨아래의 5번 CustomViewHolder는 어댑터의 뷰홀더 부분으로 뷰단의 각각의 아이템과 각각의 변수를 연결해줍니다.

MainAdapter

package com.example.recyclerviewexample;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.CustomViewHolder> {
    private ArrayList<MainData> arrayList;
    // 1번
    public MainAdapter(ArrayList<MainData> arrayList) {
        this.arrayList = arrayList;
    }

    // ---------------------------------------------------

    //2번
    @NonNull
    @Override
    public MainAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
        CustomViewHolder holder = new CustomViewHolder(view);



        return holder;
    }

    //-------------------------------------------------------------------

    //3번
    @Override
    public void onBindViewHolder(@NonNull MainAdapter.CustomViewHolder holder, int position) {
        holder.iv_profile.setImageResource(arrayList.get(position).getIv_profile());
        holder.tv_name.setText(arrayList.get(position).getTv_name());
        holder.tv_content.setText(arrayList.get(position).getTv_content());

        holder.itemView.setTag(position);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String curName = holder.tv_name.getText().toString();
                Toast.makeText(view.getContext(), curName, Toast.LENGTH_SHORT).show(); //해당 어댑터 클래스는 직접적으로 뷰랑 연결된 것이 아니기 때문에 뷰경로를 정해준다.(view.getContext())

            }
        });

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                remove(holder.getAdapterPosition());
                return true;
            }
        });
    }


    //-----------------------------------------------------------------------------

    //4번
    @Override
    public int getItemCount() {
        return (null != arrayList ? arrayList.size() : 0);
    }

    public void remove(int position){
        try {
            arrayList.remove(position);
            notifyItemRemoved(position);  //어댑테에 내장 파일로 해당 기능은 데이터에 변경이 일어나면 F5해주는것이다.

        }catch (IndexOutOfBoundsException ex){
            ex.printStackTrace();
        }

    }


//---------------------------------------------------------------------------------
//5번
    public class CustomViewHolder extends RecyclerView.ViewHolder {

        protected ImageView iv_profile;
        protected TextView tv_name;
        protected TextView tv_content;


        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            this.iv_profile=(ImageView) itemView.findViewById(R.id.iv_profile);
            this.tv_name=(TextView) itemView.findViewById(R.id.tv_name);
            this.tv_content=(TextView) itemView.findViewById(R.id.tv_content);
        }
    }
}

MainData는 데이터 모델로써 해당 RecyclerView의 리스트 한묶음에 속해있는 아이템 값들의 데이터를 설정해주거나 해당 데이터를 가져올대 사용합니다.

MainData

package com.example.recyclerviewexample;

public class MainData {
    private int iv_profile;
    private String tv_name;
    private String tv_content;


    public MainData(int iv_profile, String tv_name, String tv_content) {
        this.iv_profile = iv_profile;
        this.tv_name = tv_name;
        this.tv_content = tv_content;
    }

    public int getIv_profile() {
        return iv_profile;
    }

    public void setIv_profile(int iv_profile) {
        this.iv_profile = iv_profile;
    }

    public String getTv_name() {
        return tv_name;
    }

    public void setTv_name(String tv_name) {
        this.tv_name = tv_name;
    }

    public String getTv_content() {
        return tv_content;
    }

    public void setTv_content(String tv_content) {
        this.tv_content = tv_content;
    }
}

[결과]

'TIL' 카테고리의 다른 글

문자열을 정수로 바꾸기(알고리즘)  (0) 2024.03.05
코틀린 for문 사용 예제  (0) 2024.03.04
앱 아이콘 설정하기  (0) 2024.02.23
Rxjava 적용(4일째 고민...)  (1) 2024.02.19
이중 RecyclerView  (0) 2024.02.16
Share Link
reply
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31