안드로이드 스튜디오

안드로이드 스튜디오 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();
    }
}

 

반응형