안드로이드 스튜디오
안드로이드 스튜디오 RecyclerView
;세미콜론;
2020. 5. 10. 10:50
반응형
RecyclerView
-리스트뷰의 단점 보완
implementation 'androidx.recyclerview:recyclerview:1.1.0'
라이브러리 추가 필요
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f0f0f0"
android:layout_weight="1"/>
<Button
android:id="@+id/bnt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ADD"
android:textSize="20dp"/>
</LinearLayout>
<?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="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="7dp"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35dp"
android:text="TITLE"
android:includeFontPadding="false"
android:textStyle="bold"/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="contents"
android:textSize="20dp"
android:includeFontPadding="false"
android:textColor="#BABABA"/>
</LinearLayout>
<ImageView
android:id="@+id/image"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="right"
android:scaleType="centerCrop"
android:padding="5dp"
android:src="@mipmap/ic_launcher" />
</LinearLayout>
package com.example.recyclerview;
public class ItemData {
int image;
String title;
String contents;
public ItemData(int image, String title, String contents) {
this.image = image;
this.title = title;
this.contents = contents;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
}
package com.example.recyclerview;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public interface MyRecyclerViewClickListener{
void onItemClicked (int position);
}
private MyRecyclerViewClickListener myListener;
public void setonClickListener (MyRecyclerViewClickListener listener){
this.myListener = listener;
}
private ArrayList<ItemData> itemData;
public MyAdapter(ArrayList<ItemData> itemData){
this.itemData = itemData;
} //외부 데이터 가져오기
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.items, parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {
ItemData itemD = itemData.get(position);
holder.title.setText(itemD.getTitle());
holder.contents.setText(itemD.getContents());
holder.imageView.setImageResource(itemD.getImage());
if (myListener !=null){
final int pos = position;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myListener.onItemClicked(pos);
}
});
}
}
@Override
public int getItemCount() {
return itemData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView contents;
ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
contents = itemView.findViewById(R.id.content);
imageView = itemView.findViewById(R.id.image);
/* 고양이 원 모양으로 나오게 하고 싶으면
imageView.setBackground(new ShapeDrawable(new OvalShape()));
imageView.setClipToOutline(true);
*/
}
}
}
package com.example.recyclerview;
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 android.widget.Toast;
import java.util.ArrayList;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements MyAdapter.MyRecyclerViewClickListener {
Button bnt,bnt2;
ArrayList<ItemData> dataList = new ArrayList<>();
int cat[] = {R.drawable.pic_001,R.drawable.pic_002,R.drawable.pic_003,R.drawable.pic_004,
R.drawable.pic_005,R.drawable.pic_006,R.drawable.pic_007,R.drawable.pic_008,
R.drawable.pic_009,R.drawable.pic_010,R.drawable.pic_011,R.drawable.pic_012,
R.drawable.pic_013,R.drawable.pic_014,R.drawable.pic_015,R.drawable.pic_016,
R.drawable.pic_017,R.drawable.pic_018,R.drawable.pic_019,R.drawable.pic_020,
R.drawable.pic_021,R.drawable.pic_022,R.drawable.pic_023,R.drawable.pic_024,
R.drawable.pic_025,R.drawable.pic_026,R.drawable.pic_028,R.drawable.pic_029,
R.drawable.pic_030,R.drawable.pic_031,R.drawable.pic_032,R.drawable.pic_033,
R.drawable.pic_034,R.drawable.pic_035,R.drawable.pic_036};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
final MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
bnt = findViewById(R.id.bnt);
bnt2 = findViewById(R.id.bnt2);
bnt.setOnClickListener(new View.OnClickListener() {
Random r= new Random();
int i =r.nextInt(35);
@Override
public void onClick(View v) {
if (i>=35){
Toast.makeText(getApplicationContext(),"더이상 고양이가 없습니다...",Toast.LENGTH_SHORT).show();
}
else {
dataList.add(new ItemData(cat[i], "고양이 " + (i + 1), String.format("고양이 %03d", i + 1)));
adapter.notifyDataSetChanged();
i =r.nextInt(35);
}
}
});
bnt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dataList.size()>0){
dataList.remove(dataList.size()-1);
adapter.notifyDataSetChanged();
}
else{
Toast.makeText(getApplicationContext(),"더이상 지울 내용이 없습니다.",Toast.LENGTH_SHORT).show();
}
}
});
adapter.setonClickListener(this);
}
@Override
public void onItemClicked(int position) {
Toast.makeText(getApplicationContext(),(position+1)+"번 고양이",Toast.LENGTH_SHORT).show();
}
}
아래서부터 차례대로 삭제하기
삭제 버튼 추가, 나머지는 그대로, MainActivity.java만 수정
package com.example.recyclerview;
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 android.widget.Toast;
import java.util.ArrayList;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements MyAdapter.MyRecyclerViewClickListener {
Button bnt,bnt2;
ArrayList<ItemData> dataList = new ArrayList<>();
int cat[] = {R.drawable.pic_001,R.drawable.pic_002,R.drawable.pic_003,R.drawable.pic_004,
R.drawable.pic_005,R.drawable.pic_006,R.drawable.pic_007,R.drawable.pic_008,
R.drawable.pic_009,R.drawable.pic_010,R.drawable.pic_011,R.drawable.pic_012,
R.drawable.pic_013,R.drawable.pic_014,R.drawable.pic_015,R.drawable.pic_016,
R.drawable.pic_017,R.drawable.pic_018,R.drawable.pic_019,R.drawable.pic_020,
R.drawable.pic_021,R.drawable.pic_022,R.drawable.pic_023,R.drawable.pic_024,
R.drawable.pic_025,R.drawable.pic_026,R.drawable.pic_028,R.drawable.pic_029,
R.drawable.pic_030,R.drawable.pic_031,R.drawable.pic_032,R.drawable.pic_033,
R.drawable.pic_034,R.drawable.pic_035,R.drawable.pic_036};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
final MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
bnt = findViewById(R.id.bnt);
bnt2 = findViewById(R.id.bnt2);
bnt.setOnClickListener(new View.OnClickListener() {
Random r= new Random();
int i =r.nextInt(35);
@Override
public void onClick(View v) {
if (i>=35){
Toast.makeText(getApplicationContext(),"더이상 고양이가 없습니다...",Toast.LENGTH_SHORT).show();
}
else {
dataList.add(new ItemData(cat[i], "고양이 " + (i + 1), String.format("고양이 %03d", i + 1)));
adapter.notifyDataSetChanged();
i =r.nextInt(35);
}
}
});
bnt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dataList.size()>0){
dataList.remove(dataList.size()-1);
adapter.notifyDataSetChanged();
}
else{
Toast.makeText(getApplicationContext(),"더이상 지울 내용이 없습니다.",Toast.LENGTH_SHORT).show();
}
}
});
adapter.setonClickListener(this);
}
@Override
public void onItemClicked(int position) {
Toast.makeText(getApplicationContext(),(position+1)+"번 고양이",Toast.LENGTH_SHORT).show();
}
}
길게 눌러 삭제하기
나머지는 그대로, MainActivity.java랑 MyAdapter.java만 수정
package com.example.recyclerview;
import android.graphics.drawable.ScaleDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public interface MyRecyclerViewClickListener{
void onItemClicked (int position);
void onItemLongClicked(int position);
}
private MyRecyclerViewClickListener myListener;
public void setonClickListener (MyRecyclerViewClickListener listener){
this.myListener = listener;
}
private ArrayList<ItemData> itemData;
public MyAdapter(ArrayList<ItemData> itemData){
this.itemData = itemData;
} //외부 데이터 가져오기
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.items, parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyAdapter.ViewHolder holder, int position) {
ItemData itemD = itemData.get(position);
holder.title.setText(itemD.getTitle());
holder.contents.setText(itemD.getContents());
holder.imageView.setImageResource(itemD.getImage());
if (myListener !=null){
final int pos = position;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myListener.onItemClicked(pos);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myListener.onItemLongClicked(holder.getAdapterPosition());
return true;
}
});
}
}
@Override
public int getItemCount() {
return itemData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView contents;
ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
contents = itemView.findViewById(R.id.content);
imageView = itemView.findViewById(R.id.image);
imageView.setBackground(new ShapeDrawable(new OvalShape()));
imageView.setClipToOutline(true);
}
}
public void remove (int position){
try {
itemData.remove(position);
notifyDataSetChanged();
}
catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
}
}
package com.example.recyclerview;
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 android.widget.Toast;
import java.util.ArrayList;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements MyAdapter.MyRecyclerViewClickListener {
Button bnt;
ArrayList<ItemData> dataList = new ArrayList<>();
int cat[] = {R.drawable.pic_001,R.drawable.pic_002,R.drawable.pic_003,R.drawable.pic_004,
R.drawable.pic_005,R.drawable.pic_006,R.drawable.pic_007,R.drawable.pic_008,
R.drawable.pic_009,R.drawable.pic_010,R.drawable.pic_011,R.drawable.pic_012,
R.drawable.pic_013,R.drawable.pic_014,R.drawable.pic_015,R.drawable.pic_016,
R.drawable.pic_017,R.drawable.pic_018,R.drawable.pic_019,R.drawable.pic_020,
R.drawable.pic_021,R.drawable.pic_022,R.drawable.pic_023,R.drawable.pic_024,
R.drawable.pic_025,R.drawable.pic_026,R.drawable.pic_028,R.drawable.pic_029,
R.drawable.pic_030,R.drawable.pic_031,R.drawable.pic_032,R.drawable.pic_033,
R.drawable.pic_034,R.drawable.pic_035,R.drawable.pic_036};
final MyAdapter adapter = new MyAdapter(dataList);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
bnt = findViewById(R.id.bnt);
bnt.setOnClickListener(new View.OnClickListener() {
Random r= new Random();
int i =r.nextInt(35);
@Override
public void onClick(View v) {
if (i>=35){
Toast.makeText(getApplicationContext(),"더이상 고양이가 없습니다...",Toast.LENGTH_SHORT).show();
}
else {
dataList.add(new ItemData(cat[i], "고양이 " + (i + 1), String.format("고양이 %03d", i + 1)));
adapter.notifyDataSetChanged();
i =r.nextInt(35);
}
}
});
adapter.setonClickListener(this);
}
@Override
public void onItemClicked(int position) {
Toast.makeText(getApplicationContext(),(position+1)+"번 고양이",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClicked(int position) {
adapter.remove(position);
Toast.makeText(getApplicationContext(),(position+1)+"번 고양이 삭제",Toast.LENGTH_SHORT).show();
}
}
반응형