안드로이드 이론 빡공 20
본문 바로가기
안드로이드(Android)

안드로이드 이론 빡공 20

by KyeongMin 2020. 7. 3.
728x90
반응형

package com.threedpit.mylist;

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

import android.os.Bundle;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

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

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

        //그리드 모양으로 보여주거나 테이블 모양으로도 보여줄 수 있는데
        //그게 LayoutManager을 이용한다.
        LinearLayoutManager layoutManager =  new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(layoutManager);

        PersonAdapter adapter = new PersonAdapter();
        adapter.addItem(new Person("3DPIT","010-0000-0000"));
        adapter.addItem(new Person("4DPIT","010-1111-1111"));
        adapter.addItem(new Person("5DPIT","010-2222-2222"));


        recyclerView.setAdapter(adapter);
    }
}

 

**Person.java**

데이터를 담을 클래스를 만들어준다.

package com.threedpit.mylist;

// 한 아이템을 위한 데이터를 담기위한 클래스
public class Person {
    String name;
    String moblie;

    //생성자
    public Person(String name, String moblie) {
        this.name = name;
        this.moblie = moblie;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMoblie() {
        return moblie;
    }

    public void setMoblie(String moblie) {
        this.moblie = moblie;
    }
}

리사이클러 뷰는 선택 위젯이라고 한다.

현재 눈에 보이는것 자체는 리사이클러 뷰가 담당하고 있지만

실제로 데이터 관리나 이 뷰 자체를 컨트롤 하는것은 어댑터라는 것을 사용

 

**PersonAdapter.java**

컨트롤 할 수 있는 어댑터를 만들어준다.

package com.threedpit.mylist;

import android.text.Layout;
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 PersonAdapter extends  RecyclerView.Adapter<PersonAdapter.ViewHolder>{
   ArrayList<Person> items = new ArrayList<Person>();

   public void addItem(Person item){//Person 객체를 추가하기 위한 메소드
       items.add(item);
   }
   public void setItems(ArrayList<Person> items){//ArrayList 전체를 설정할 수 있는 메소드
       this.items = items;
   }
   public Person getItem(int position){// 몇번째 있는 아이템을 리턴해 달라
       return items.get(position);
   }
    public void setItem(int position, Person item ){
       items.set(position,item);
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 이것은 뷰홀더가 생성되는 시점에 자동으로 실행됨
        // 여기서는 각각의 아이템에 대한 뷰홀더를 만들어 달라는 것이기 때문에
        // 그 아이템을 위한 레이아웃을 인플레이션 하고 그 레이아웃 인플레이션한 뷰를 가지고
        // 그 뷰 홀더를 리턴해주면된다.
        //그렇게 하면 하나의 아이템을 위한 뷰홀더가 만들어져서 리턴됨
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());// getSystems에서 참조하는것이랑 비슷하다.
       View itemView = inflater.inflate(R.layout.person_item,parent,false);

        return new ViewHolder(itemView);
    }

    @Override
    //뷰 홀더라는게 계속해서 만들어지는것이 아니다.
    //전화번호부의 연락처에 아이템이 백개가 될 수 있고 만개가 될 수도 있는데
    //그런것을 올릴때 마다 new 해주면 메모리 증가로 이어진다.
    //그럼 메모리의 낭비를 줄이기 위해 ViewHolder 는 재사용이 된다.
    //화면상에서 우리가 화면을 내리면 기존의 위로 올라간 뷰를
    //재사용하여 다시 표현해주는것 이라고 생각하자.
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Person item = items.get(position);
    holder.setItem(item);
    }

    @Override
    //안의 객체 몇개인가요
    public int getItemCount() {
        return items.size();
    }

    static class ViewHolder extends  RecyclerView.ViewHolder{
       //글자가 두개 표시될 수 있도록 두개의 텍스트 뷰를 만들것이다.
        TextView textView;
        TextView textView2;
        public ViewHolder(View itemView){
            super(itemView);

           textView = itemView.findViewById(R.id.textView);
           textView2 = itemView.findViewById(R.id.textView2);
        }
        public void setItem(Person item){
            textView.setText(item.getName());
            textView2.setText(item.getMoblie());
        }
    }
    //우리가 하나의 아이템이 화면에 보여질 때
    //레이아웃을 만들 예정인데 그 레이아웃에 해당하는 뷰를 담아둘 객체
    // 그것을 홀더라고 한다. 필요한때 쓰고

}

**person_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="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="#FFFFFF"
        app:cardCornerRadius="10dp"
        app:cardElevation="5dp"
        app:cardUseCompatPadding="true"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                app:srcCompat="@drawable/ic_launcher_foreground" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_margin="5dp">
            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="이름"
                android:textColor="#0000FF"
                android:textSize="30sp"/>
            <TextView
                android:id="@+id/textView2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="전화번호"
                android:textColor="#00FFFF"
                android:textSize="24sp"/>
            </LinearLayout>
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>

**activity_main.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="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

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

**MainActivity.java**

 

LinearLayout을 이용하여 만든 경우

 

package com.threedpit.mylist;

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

import android.os.Bundle;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

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

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

        //그리드 모양으로 보여주거나 테이블 모양으로도 보여줄 수 있는데
        //그게 LayoutManager을 이용한다.
        LinearLayoutManager layoutManager =  new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(layoutManager);

        PersonAdapter adapter = new PersonAdapter();
        adapter.addItem(new Person("3DPIT","010-0000-0000"));
        adapter.addItem(new Person("4DPIT","010-1111-1111"));
        adapter.addItem(new Person("5DPIT","010-2222-2222"));


        recyclerView.setAdapter(adapter);
    }
}

 

**OnPersonItemClickListener.java**

구현할것을 하나 정의하고

package com.threedpit.mylist;

import android.view.View;

public interface OnPersonItemClickListener {
    // 어떤 아이템이 호출이 되면 이 함수를 호출 할것이다.
    public void onItemClick(PersonAdapter.ViewHolder holder, View view, int position );
}

**PersonAdapter.java**

이파일을 수정해준다.

package com.threedpit.mylist;

import android.text.Layout;
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 PersonAdapter extends  RecyclerView.Adapter<PersonAdapter.ViewHolder>{
   ArrayList<Person> items = new ArrayList<Person>();

   OnPersonItemClickListener listener;

   public void addItem(Person item){//Person 객체를 추가하기 위한 메소드
       items.add(item);
   }
   public void setItems(ArrayList<Person> items){//ArrayList 전체를 설정할 수 있는 메소드
       this.items = items;
   }
   public Person getItem(int position){// 몇번째 있는 아이템을 리턴해 달라
       return items.get(position);
   }
    public void setItem(int position, Person item ){
       items.set(position,item);
    }

    public void setOnItemClickListener(OnPersonItemClickListener listener){
       this.listener= listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 이것은 뷰홀더가 생성되는 시점에 자동으로 실행됨
        // 여기서는 각각의 아이템에 대한 뷰홀더를 만들어 달라는 것이기 때문에
        // 그 아이템을 위한 레이아웃을 인플레이션 하고 그 레이아웃 인플레이션한 뷰를 가지고
        // 그 뷰 홀더를 리턴해주면된다.
        //그렇게 하면 하나의 아이템을 위한 뷰홀더가 만들어져서 리턴됨
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());// getSystems에서 참조하는것이랑 비슷하다.
       View itemView = inflater.inflate(R.layout.person_item,parent,false);

        return new ViewHolder(itemView,listener);
    }

    @Override
    //뷰 홀더라는게 계속해서 만들어지는것이 아니다.
    //전화번호부의 연락처에 아이템이 백개가 될 수 있고 만개가 될 수도 있는데
    //그런것을 올릴때 마다 new 해주면 메모리 증가로 이어진다.
    //그럼 메모리의 낭비를 줄이기 위해 ViewHolder 는 재사용이 된다.
    //화면상에서 우리가 화면을 내리면 기존의 위로 올라간 뷰를
    //재사용하여 다시 표현해주는것 이라고 생각하자.
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Person item = items.get(position);
    holder.setItem(item);
    }

    @Override
    //안의 객체 몇개인가요
    public int getItemCount() {
        return items.size();
    }

    static class ViewHolder extends  RecyclerView.ViewHolder{
       //글자가 두개 표시될 수 있도록 두개의 텍스트 뷰를 만들것이다.
        TextView textView;
        TextView textView2;
        public ViewHolder(View itemView,final OnPersonItemClickListener listener){
            super(itemView);

           textView = itemView.findViewById(R.id.textView);
           textView2 = itemView.findViewById(R.id.textView2);

           itemView.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   int position = getAdapterPosition();// 눌린 position 받고
                   if(listener != null){
                       //listener를 통해 눌린지에 대한 정보를 보낼 수 있다.
                       listener.onItemClick(ViewHolder.this,v,position);

                   }
               }
           });
        }
        public void setItem(Person item){
            textView.setText(item.getName());
            textView2.setText(item.getMoblie());
        }
    }
    //우리가 하나의 아이템이 화면에 보여질 때
    //레이아웃을 만들 예정인데 그 레이아웃에 해당하는 뷰를 담아둘 객체
    // 그것을 홀더라고 한다. 필요한때 쓰고

}

**MainActivity.java**

여기에서 수정할 부분을 수정하면 이렇게 나온다.

package com.threedpit.mylist;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    PersonAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        //그리드 모양으로 보여주거나 테이블 모양으로도 보여줄 수 있는데
        //그게 LayoutManager을 이용한다.
        LinearLayoutManager layoutManager =  new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);

       // GridLayoutManager layoutManager = new GridLayoutManager(this,2);
        recyclerView.setLayoutManager(layoutManager);

        // 이부분의 경우 사용자가 버튼을 눌러
        //입력한것 대로 나오게 한다던지
        //네트워킹을 통해 받아온 데이터 내부에서 자동으로
        //리사이클뷰에 어댑터에 추가하는 방식이 있다. 
        adapter = new PersonAdapter();
        adapter.addItem(new Person("3DPIT","010-0000-0000"));
        adapter.addItem(new Person("4DPIT","010-1111-1111"));
        adapter.addItem(new Person("5DPIT","010-2222-2222"));


        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new OnPersonItemClickListener() {
            @Override
            public void onItemClick(PersonAdapter.ViewHolder holder, View view, int position) {
               Person item = adapter.getItem(position);
                showToast("아이템 선택됨 : " + item.getName());
            }
        });
    }
    public void showToast(String data){
        Toast.makeText(this,data,Toast.LENGTH_SHORT).show();
    }

}

 

728x90
반응형

'안드로이드(Android)' 카테고리의 다른 글

안드로이드 이론 빡공 22  (0) 2020.07.07
안드로이드 이론 빡공 21  (0) 2020.07.06
안드로이드 이론 빡공 19  (0) 2020.07.01
안드로이드 이론 빡공 18  (0) 2020.07.01
안드로이드 이론 빡공 17  (0) 2020.06.29

댓글