250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 막내의막무가내 일상
- 안드로이드 Sunflower 스터디
- 막내의막무가내 rxjava
- 막내의막무가내 목표 및 회고
- flutter network call
- 막내의 막무가내
- 막무가내
- Fragment
- 막내의막무가내 코틀린
- 막내의 막무가내 알고리즘
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 안드로이드
- 부스트코스에이스
- 막내의막무가내 안드로이드 코틀린
- 안드로이드
- 프래그먼트
- 부스트코스
- 주엽역 생활맥주
- 막내의막무가내 플러터
- 안드로이드 sunflower
- 막내의막무가내 알고리즘
- 주택가 잠실새내
- 막내의막무가내 SQL
- 2022년 6월 일상
- 막내의막무가내 프로그래밍
- 막내의막무가내
- 막내의막무가내 안드로이드 에러 해결
- 프로그래머스 알고리즘
- 막내의막무가내 플러터 flutter
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] 기억노트 필기 - 리싸이클러뷰 정리 본문
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
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] Bundle 간단 사용 예제 및 방법 ( 액티비티 프래그먼트 데이터전달 ) (1) | 2019.03.22 |
---|---|
[안드로이드] Glide 라이브러리 간단한 사용방법 + 비트맵으로받기 (0) | 2019.03.22 |
[안드로이드] 프래그먼트 뒤로가기 했을때 처리 (9) | 2019.03.20 |
[안드로이드] Volley 라이브러리 사용법 (2) | 2019.03.09 |
[안드로이드] 스레드(Thread) , 핸들러(Handler) 정리 (1) | 2019.03.05 |
Comments