본문 바로가기
Mobile/Android

MVC 패턴 리사이클러뷰(Android RecyclerView)

by min_gui 2021. 5. 29.

MVC   Model, View , Control  약자입니다.

 

Model  : 데이터 베이스 api 관리, 데이터가 정의 되어 있는곳.

View    : 사용자 에게 보여질 UI 화면, 레이아웃

Control : View 에서 사용자의 행동을 알림을 받고 model 에서 데이터를 가져와 View 에 전달하는 역할

 

MVC 는 주로 웹 페이지에서 많이 사용합니다. 

 

안드로이드 에서는 리스트뷰나, 리사이클러 뷰를 이용할때 하나의 Activity 안에서 모든 구현이 가능하지만 , 코드의 가독성 또는 유지보수가 어려워 짐으로 MVC 패턴을 이용합니다.

 

 

출처 :https://medium.com/upday-devs/android-architecture-patterns-part-1-model-view-controller-3baecef5f2b6

 

 

 

리사이클러뷰 예제를 만들어 보겠습니다.

예제)

recyclerview

 

1. 구성은 MainActivity.java==View, Adapter.java==control, Item.java=model 이루어 집니다.

2. Layout  2 recycler_view_item.xml , activity_main.xml 입니다.

 

 

  1) activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="451dp"
        android:layout_marginStart="1dp"
        android:layout_marginEnd="1dp"
        android:layout_marginBottom="1dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

 

2)recycler_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/id_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="3"
            android:gravity="center"
            android:text="TextView" />

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="2"
            app:srcCompat="@mipmap/ic_launcher" />

        <TextView
            android:id="@+id/name_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:gravity="center"
            android:text="TextView" />
    </LinearLayout>
</LinearLayout>

 

3. 먼저 List에 들어갈 각행 Item.java 데이터를 정의해 줍니다.

/**
 * Model
 * **/
public class Item {

    private String id ;
    private int imageResource;
    private String name;

    public Item(String id, int imageResource, String name){
        this.id =id;
        this.imageResource=imageResource;
        this.name=name;
    }

    public String getId() {
        return id;
    }

    public int getImageResource() {
        return imageResource;
    }

    public String getName() {
        return name;
    }
}

 

4.Adapter.java

 

/***
 * control
 *
 * ***/

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    Context context;
    //adapter에 들어갈 list
    ArrayList<Item> items = new ArrayList<>();


    //MainActivity 에서 context, items 받아오기
    public Adapter(Context context, ArrayList<Item> items) {
        this.context = context;
        this.items = items;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //recycler_view_item.xml을 inflate 시킨다.
        View view = LayoutInflater.from(context).inflate(R.layout.recycler_view_item, parent, false);

        return new ViewHolder(view);
    }


    /*onbindviewholder 란 ListView / RecyclerView 는 inflate를 최소화 하기 위해서 뷰를 재활용 하는데,
    이 때 각 뷰의 내용을 업데이트 하기 위해 findViewById 를 매번 호출 해야합니다.
    이로 인해 성능저하가 일어남에 따라 ItemView의 각 요소를 바로 엑세스 할 수 있도록 저장해두고 사용하기 위한 객체입니다.*/
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        //list 에 아이템 하나하나 보여주는 메소드 입니다.

        Item item = items.get(position);
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,position,Toast.LENGTH_LONG).show();
            }
        });

        holder.id_view.setText(item.getId());
        holder.name_view.setText(item.getName());
        holder.imageView.setImageResource(item.getImageResource());
        //holder.imageView.getResources().getDrawable(item.getImageResource());
    }

    //리스트의 아이템 갯수
    @Override
    public int getItemCount() {
        return items.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        //item view 를 setting 해줍니다.

        TextView id_view, name_view;
        ImageView imageView;

        ViewHolder(View view) {
            super(view);

            id_view = (TextView) view.findViewById(R.id.id_view);
            imageView = (ImageView) view.findViewById(R.id.imageView);
            name_view = (TextView) view.findViewById(R.id.name_view);
        }

    }
}

 

 

5.MainActivity.java

 

/***
 * View
 * 
 * **/
public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    Adapter adapter;
    ArrayList items =new ArrayList<>();


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

        recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
        items.add(new Item("1",R.drawable.ic_launcher_background,"11"));
        items.add(new Item("2",R.drawable.ic_launcher_foreground,"22"));
        items.add(new Item("3",R.drawable.ic_launcher_foreground,"33"));
        items.add(new Item("4",R.drawable.ic_launcher_foreground,"44"));
        items.add(new Item("5",R.drawable.ic_launcher_foreground,"55"));
        items.add(new Item("6",R.drawable.ic_launcher_foreground,"66"));
        items.add(new Item("7",R.drawable.ic_launcher_foreground,"77"));

        setRecyclerView();
    }

    //recyclerView 와 adapter 를 연결시켜주는 메소드
    void setRecyclerView(){
        LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);

        //액티비티에 context 와 item 데이터를 Adapter 에 넘겨준다.
        adapter = new Adapter(MainActivity.this,items);
        recyclerView.setAdapter(adapter);


    }
}

 

 

6.결과

 

recyclerview

 

 

 

'Mobile > Android' 카테고리의 다른 글

Android/Kotlin)Sharedpreferences 에서 Jetpack DataStore  (0) 2021.10.14
Android/Kotlin ) SQLlite 사용법.  (0) 2021.07.11