반응형

Recycler view를 사용하기 위해서 먼저 인터페이스를 구현 해주어야한다.

implementation 'androidx.recyclerview:recyclerview:1.1.0'

그 다음, 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 와 같다고 생각하시고 작업하셔도 무리가없을것입니다. 출처 : 여기

반응형

+ Recent posts