관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 기억노트 필기 - 리싸이클러뷰 정리 본문

안드로이드/자바 & Previous

[안드로이드] 기억노트 필기 - 리싸이클러뷰 정리

막무가내막내 2019. 3. 21. 15:52
728x90

주석설명 달아논거 이해 안까먹게 복습용

 

 

 

메인

package com.example.a82107.myrecycleview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    SingerAdapter adapter;

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

        recyclerView = findViewById(R.id.recyclerView);

        //2번쨰파라미터는 넘기는방향을 의미, 3번쨰파라미터는 아이템이 보이는 방향을 의미한다. (예를들어 카카오톡같은 경우 채팅이 밑에서 위로 올라가므로 true로 해야할거다.)
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);

        adapter = new SingerAdapter(getApplicationContext()); //컨텍스트객체 전달
        //데이터샘플
        adapter.addItem(new SingerItem("우주소녀", "010-2313-1245"));
        adapter.addItem(new SingerItem("여자친구", "010-1234-1225"));
        adapter.addItem(new SingerItem("원더걸스", "010-1111-2345"));
        adapter.addItem(new SingerItem("나인뮤지스", "010-0785-9964"));
        recyclerView.setAdapter(adapter);

        //리사이클러뷰는 버튼처럼 클릭리스너가없음 (그래서 어뎁터에다가 구현하기로한다)
        //이벤트를 처리하는게 리스트뷰같은 경우에는 setOnItemClickListener()라고 미리정의된게 있는데
        //리싸이클러뷰는 그게 없으니까 리스트뷰처럼 사용할 수 있도록 어댑터쪽에서 리스너관련된걸 따로 추가해준거다.
        adapter.setOnItemClickListener(new SingerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(SingerAdapter.ViewHolder holder, View view, int position) {
                SingerItem item = adapter.getItem(position);
                Toast.makeText(getApplicationContext(), "아이템 선택됨 : "+ item.getName(), Toast.LENGTH_LONG).show();

            }
        });


    }
}

 

 

어댑터

package com.example.a82107.myrecycleview;


import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.TextView;

import java.util.ArrayList;

//뷰홀더라는게 결국에는 각각의 아이템을 위한 뷰를 따로 정의할 때 뷰 클래스의 역할처럼 하고 있는것이다.
//이 뷰를 담고있는 역할을 하는구나라고 생각하면 된다.
public class SingerAdapter extends RecyclerView.Adapter<SingerAdapter.ViewHolder> {
    Context context;

    //뷰가아닌 데이를 담음
    ArrayList<SingerItem> items = new ArrayList<SingerItem>();

    OnItemClickListener listener;

    //기존에 있는거와 동일한이름인데 하나 새로 정의함.
    //이벤트를 처리하는게 리스트뷰같은 경우에는 setOnItemClickListener()라고 미리정의된게 있는데
    //리싸이클러뷰는 그게 없으니까 리스트뷰처럼 사용할 수 있도록 이렇게 리스너관련된걸 따로 추가해준거다.
    public static interface OnItemClickListener {
        public void onItemClick(ViewHolder holder, View view, int position);
    }

    public SingerAdapter(Context context) {
        this.context = context;
    }

    //뷰홀더라고 하는게 처음에 만들어 지는 시점에서 자동으로 호출됨
    //즉 각 아이템을 위한 뷰홀더 객체가 처음 만들어지는 시점에 이메소드가 자동으로 호출됨
    //만약 각각의 아이템을 위한 뷰홀더가 재사용 될 수 있는 상태라면 호출되지않는다.  ++) 인강에서는 viewGrop은 parent i 는 position으로 되있음
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        //그래서 여기서는 뷰홀더 객체를 새로 하나 생성해주면 된다.

        //참조한 context의 뷰를 사용하기위해서 inflate해주는 과정
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.singer_item, viewGroup, false); //여기서 viewGroup은 결국 각각의 아이템을 위해서 정의한 xml 레이아웃의 최상위 레이아웃이라고 생각하면 된다.

        return new ViewHolder(itemView);
        //사실상 이코드는 이해를 했으면 매번 그냥 복사해서 갖다가 쓰면된다.
    }

    //뷰홀더라는게 바인딩 될 시점의 메소드
    @Override  //++) 인강에서는 viewHolder는 holder, i 는 position으로 되있음
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        SingerItem item = items.get(i); //i는 포지션임 , i는 리싸이클러뷰에서 몇 번째 게 지금 보여야 되는 시점이다라는 것을 알려줌
        viewHolder.setItem(item); //뽑은 아이템을 홀더에 넣어줌
        //그럼 뷰홀더가 데이터를 알 수 있게되고 그래서 뷰홀더에 들어가있는 뷰에다가 데이터를 설정할 수 있다.

        viewHolder.setOnItemClickListener(listener);
    }

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

    //어댑터에 아이템을 추가하고싶을떄 메소드
    public void addItem(SingerItem item) {
        items.add(item);
    }

    //만약 ArrayList라고 하는 items를 그대로 설정하고싶은 경우
    public void addItems(ArrayList<SingerItem> items) {
        this.items = items;
    }

    public SingerItem getItem(int position) {
        return items.get(position);
    }

    //메인에써져있는 주석참고 (클릭했을때의 리스너를 어댑터에 직접구현해놓았다. 내가..)
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    //뷰홀더란 각각의 아티템을 위한 뷰를 담아두기위한 용도로 사용한다
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        TextView textView2;

        OnItemClickListener listener;

        //뷰홀더는 각각의 아이템을 위한 뷰를 담고있다고 했는데 그 뷰가 이 생성자의 itemVIew에 전달이 되는 것이다.
        //예를들어 여기서는 singer_item.xml 뷰인 textView, textView2가 이 View itemView에 들어가 있다 생각하면된다.
        //그러므로 해당 뷰를 우리는 이용할 수 있다.
        public ViewHolder(@NonNull View itemView) {
            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();
                    //아까 어댑터에 등록한 리스너쪽으로 넘겨준다.
                    if(listener != null){
                        listener.onItemClick(ViewHolder.this, v,position );
                    }
                }
            });
        }

        //뷰홀더 생성자에서 뷰를 갖고왔으니 해당 뷰에 데이터를 설정할 수 있다.
        public void setItem(SingerItem item) {
            textView.setText(item.getName());
            textView2.setText(item.getMobile());
        }

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


    }
}

 

 

아이템

package com.example.a82107.myrecycleview;

public class SingerItem {
    String name;
    String mobile;

    public SingerItem(String name, String mobile) {
        this.name = name;
        this.mobile = mobile;
    }

    public String getName() {
        return name;
    }

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

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}

 

728x90
Comments