MVC 는 Model, View , Control 의 약자입니다.
Model : 데이터 베이스 api 관리, 데이터가 정의 되어 있는곳.
View : 사용자 에게 보여질 UI 화면, 레이아웃
Control : View 에서 사용자의 행동을 알림을 받고 model 에서 데이터를 가져와 View 에 전달하는 역할
MVC 는 주로 웹 페이지에서 많이 사용합니다.
안드로이드 에서는 리스트뷰나, 리사이클러 뷰를 이용할때 하나의 Activity 안에서 모든 구현이 가능하지만 , 코드의 가독성 또는 유지보수가 어려워 짐으로 MVC 패턴을 이용합니다.
리사이클러뷰 예제를 만들어 보겠습니다.
예제)
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 |