Recycler view를 사용하기 위해서 먼저 인터페이스를 구현 해주어야한다.
그 다음, acticity_amin.xml에 Recyclerview를 넣어주고,
<?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=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
재활용을 할 xml를 구현해준다.
RelativeLayout을 사용하면 좀 더 유용하게 재활용 할 수 있다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/cardview"
android:layout_width="match_parent"
android:layout_margin="@dimen/cardview_compat_inset_shadow"
android:layout_height="wrap_content" >
<LinearLayout
android:paddingTop="5dp"
android:paddingLeft="5dp"
android:paddingBottom="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="Title"
android:textStyle="bold"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/description"
android:text="description"
android:textSize="17dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/fight"
android:text="fight"
android:textSize="17dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
생성자(Contructor)를 구현하여, 구조를 잡아주고, getter과 setter를(가져오고, 저장)만들어 준다.
package Model;
public class ListItem {
private String name;
private String description;
private String fight;
public ListItem(String text, String description, String fight) {
this.name = text;
this.description = description;
this.fight = fight;
}
public String getFight() {
return fight;
}
public void setFight(String fight) {
this.fight = fight;
}
public String getText() {
return name;
}
public void setText(String text) {
this.name = text;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
반복적인 컬럼을 사용, 관리를 용이하게 하기위해 adapter를 만들어주어야한다.
package Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import Model.ListItem;
import tipcalculator.gohool.recyclerview5.R;
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder> {
//Application 환경에 대한 전역 정보를 접근하기 위한 인터페이스
//갑자기 떠오른거지만, context는 자바스크립트의 locals와 비슷한거같다.
//local은 지역변수로서, 한 바운더리 내에서만 사용하지만, locals를 사용한다면, 전역적으로 어느 곳에서든 사용 정보,값 등을 받아올 수 있다.
private Context context;
//List에 내가 만든 Listitem을 넣어줌 = 원룸건물 (구조, getter and setter로 만들어 둔 것 = 방한칸)
private List<ListItem> listItems;
//생성자 : 필드 초기화
public MainAdapter(Context context, List listItems){
this.context = context;
this.listItems = listItems;
}
//이 친구는, 우리가 만든 xml파일들을 -> view 타입으로 바꿔줌.
@NonNull
@Override
public MainAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MainAdapter.MyViewHolder holder, int position) {
//(구조, getter and setter로 만들어 둔 것 중에서 내가 선택한 그놈 그세키 그래 그놈이야 너가 선택한 그놈. 데려옴)
ListItem item = listItems.get(position);
holder.name.setText(item.getText());
holder.description.setText(item.getDescription());
holder.fight.setText(item.getFight());
}
@Override
public int getItemCount() {
return listItems.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
//우리가 xml에 만든거 가져옴 (앞에서말한 내가 생성자를 만든 그것과 헷갈리면 안된다. 이것은 내가 xml파일로 구현한 xml이다)
public TextView name;
public TextView description;
public TextView fight;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(this);
name = (TextView) itemView.findViewById(R.id.title);
description = (TextView) itemView.findViewById(R.id.description);
fight = (TextView) itemView.findViewById(R.id.fight);
}
@Override
//TODO 클릭 이벤트 리스터 구현
public void onClick(View v) {
int position = getAdapterPosition();
ListItem touched = listItems.get(position);
Toast.makeText(context, touched.getText(), Toast.LENGTH_LONG).show();
}
}
}
//MainActivity.java
package tipcalculator.gohool.recyclerview5;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import Adapter.MainAdapter;
import Model.ListItem;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//너비와 높이가 고정 된 자식 (항목)이 있음을 의미
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
listItems = new ArrayList<>();
//값을 넣어줌
ListItem item1 = new ListItem("hello there", "noone", "bye");
ListItem item2 = new ListItem("noone here", " then die", "ok");
//add는 필수
listItems.add(item1);
listItems.add(item2);
//실행
adapter = new MainAdapter(this,listItems);
recyclerView.setAdapter(adapter);
}
}
최대한 이해가 가기 쉽게 써놓았다. 물론 나한테만 쉬울 수도 있다.. 이해만.
+++++
각 포지션(위치)를 인자를 받아 터치를 한다면, 다른 화면으로 들어가는 기능을 추가 해보았다.
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
//우리가 xml에 만든거 가져옴 (앞에서말한 내가 생성자를 만든 그것과 헷갈리면 안된다. 이것은 내가 xml파일로 구현한 xml이다)
public TextView name;
public TextView description;
public TextView fight;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(this);
name = (TextView) itemView.findViewById(R.id.title);
description = (TextView) itemView.findViewById(R.id.description);
fight = (TextView) itemView.findViewById(R.id.fight);
}
@Override
//TODO 클릭 이벤트 리스터 구현
public void onClick(View v) {
//onBindViewHolder의 인자를 받아옴
int position = getAdapterPosition();
//구조화시켜준거 onBindViewHolder에서 한거랑 같음
ListItem touched = listItems.get(position);
//
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("name", "name : " + touched.getText() );
intent.putExtra("description","description : " + touched.getDescription());
intent.putExtra("fighting","fighting? : " + touched.getFight());
//activity가 아니니, context를 사용해서 실행함.
context.startActivity(intent);
}
DetailActicity 하는 컴포넌트를 만들어주었다.
package tipcalculator.gohool.recyclerview5;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class DetailActivity extends AppCompatActivity {
TextView name, description, fight;
Bundle extras;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
name = (TextView) findViewById(R.id.dtexdt1);
description = (TextView) findViewById(R.id.dtext2);
fight = (TextView) findViewById(R.id.dtext3);
//컴포넌트 끼리 소통할 수 있게 데이터를 넣어논 정보주머니
extras = getIntent().getExtras();
name.setText(extras.getString("name"));
description.setText(extras.getString("description"));
fight.setText(extras.getString("fighting"));
}
}
-여기저기 둘러보다가 context의 의미를 한발자국 더 가까워 질 수 있게 만든 어떤 블러거의 Context의 의미-
매개변수로 Context클래스를 요구하는 것들을 볼수있습니다. Context란 문맥이라는 뜻인데 쉽게 생각해서 안드로이드의 한 화면 단위 클래스가 Activity인데 이 Activity에서 중요한 부분을 가지고 있는 클래스라고 생각하면 됩니다.
Context context -> Activity이름.this 와 같다고 생각하시고 작업하셔도 무리가없을것입니다. 출처 : 여기
'개발언어 > JAVA' 카테고리의 다른 글
Shared Preferences(안드로이드 데이터 저장(키, 값)) (0) | 2020.12.19 |
---|---|
안드로이드 앱 개발1(Music app) (0) | 2020.12.18 |
안드로이드 앱 개발하기(recycler view 사용법) (0) | 2020.12.12 |
안드로이드 앱 개발하기(개 고양이 정보 가져오기) (0) | 2020.12.07 |
안드로이드 다른 화면으로 이동하기 (0) | 2020.12.03 |