City At Night

[Android Studio] RecyclerView를 사용하여 데이터를 추가해보자! 본문

Android Studio

[Android Studio] RecyclerView를 사용하여 데이터를 추가해보자!

Wuny 2021. 1. 30. 19:28
728x90
반응형

예전에는 ListView를 많이 사용했지만 요즈음에는 RecyclerView를 많이 사용합니다.

ListView는 제가 데이터의 갯수?만큼 List의 크기를 지정 해줘야하지만 RecyclerView는 그렇지 않습니다.

예를 들어보면 커피의 종류가 100가지가 있다고 가정하겠습니다.

ListView는 100개의 커피의 종류를 나타내기 위해 100개의 List의 크기를 지정해줘야하지만 

RecyclerView는 UI에 5개만 보여주게 된다고 하면 6번째 커피는 첫 번째의 커피 View를 다시 사용하여 6번째 View를 보여줍니다. 그래서 재활용 RecyclerView라고 하죠.

Documentation에서는 이렇게 말하고 있습니다.

출처: 안드로이드 공식문서

우선 RecyclerView가 보여지게될 MainActivity.class와 layout은 당연히 필요하고,

RecyclerView에 데이터를 추가하는 Adapter.class 그리고 RecyclerView위에 추가될 아이템(데이터)Layout이 필요합니다.

 

<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=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

저처럼 굳이 ContraintLayout에 LinearLayout을 추가하고  RecyclerView를 추가할 필요없고 바로 최상위 Layout에서 바로 RecyclerView를 추가하셔도 됩니다!

 

<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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="10dp"
        app:cardElevation="5dp"
        app:cardUseCompatPadding="true"
        app:cardBackgroundColor="#FFFFFFFF"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="데이터가 추가됩니다."
            android:textSize="30sp"
            tools:layout_editor_absoluteX="3dp"
            tools:layout_editor_absoluteY="49dp" />
    </androidx.cardview.widget.CardView>




</LinearLayout>

여기서 조심해야할 점은 최상위 Layout이 Linear이여야 합니다!

왜인지는 잘 모르겠습니다.. 저는 constraint 자주 사용하는데 이것때문에 삽질좀 했네요;

 

<Adapter.java>

package com.example.recyclerview_tistory;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    private ArrayList<String> arrayList;

    public Adapter(ArrayList<String> arrayList){
        this.arrayList=arrayList;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View itemView = layoutInflater.inflate(R.layout.view_item, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String item =arrayList.get(position);
        holder.setItem(item);
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView textView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }
        public void setItem(String item){
            textView.setText(item);
        }
    }

    public void addItem(String item){
        arrayList.add(item);
        Log.d("#######배열에 넣어짐 -->    ",item);
    }
    public void setarrayList(ArrayList<String> arrayList) {

        this.arrayList = arrayList;
    }

    public String getItem(int position) {

        return arrayList.get(position);
    }

    public void setItem(int position, String item) {

        arrayList.set(position, item);
    }
}

한번 만들어 놓고 다음부터 복사하여 커스텀해서 사용하시면 됩니다!!

<MainActivity.java>

package com.example.recyclerview_tistory;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private ArrayList<String> arrayList = new ArrayList<String>();
    private Adapter adapter = new Adapter(arrayList);

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

        recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);

         linearLayoutManager = new LinearLayoutManager(this);
        ((LinearLayoutManager) linearLayoutManager).setReverseLayout(true);
        ((LinearLayoutManager) linearLayoutManager).setStackFromEnd(true);

        recyclerView.setLayoutManager(linearLayoutManager);

       

        adapter.addItem("first Data Test");
        adapter.addItem("Second Data Test");
        adapter.addItem("Third Data Test");
        adapter.addItem("fourth Data Test");

 		recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();




    }
}

((LinearLayoutManager) layoutManager).setReverseLayout(true);
((LinearLayoutManager) layoutManager).setStackFromEnd(true);

 이 부분은 데이터를 추가하였을시 데이터가 거꾸로 출력이 됩니다!

데이터를 1 -> 2 -> 3 -> 4  순으로 넣었으면 보여질때는 4,3,2,1 순으로  최신순으로 보여지게 됩니다. 상황에 따라 잘 사용하시면 됩니다!

좌: 기본/ 우: Reverse

그럼 저번 포스팅인 내장객체 함수 SharedPreferences를 사용하고 Recyclerview를 사용하면

ToDo App을 만들 수 있겠죠?

728x90
반응형
Comments