지난 포스트들에서 자주 사용된 Adapter를 설명하겠습니다. Adapter는 데이터 모델들을 원하는 상황에 적용할 수 있게 도와줍니다.
1. 준비물
먼저 만들었던 flower 모델이랑 flowerapi를 가져옵니다. post를 다루기 위한 모델과 api입니다. 덤으로 Glide도 가져옵니다. 여기서 Glide를 처리해 주어야합니다.
import com.bumptech.glide.Glide; import com.example.keepair.myapplication.R; import com.example.keepair.myapplication.model.Flower; | cs |
2. Adapter ViewHolder 작성
그 다음에 Adapter랑 RecyclerView.Adapter를 만들어줍니다. RecyclerView를 사용하지 않는다면 다른 뷰를 extends 해도 괜찮습니다. Adapter에서 제공하는 Holder를 불러와서 사용합니다.
public class FlowerAdapter extends RecyclerView.Adapter<FlowerAdapter.Holder> { } | cs |
Adapter에 Holder를 붙여줘야 합니다. 그렇지 않으면 제대로 작동하지 않습니다.
private static final Object TAG = FlowerAdapter.class.getSimpleName(); private final FlowerClickListener mListener; private List<Flower> mFlowers; | cs |
이렇게 변수를 지정해줍니다. getSimpleName()은 지난번에 설명한 글에 설명되어 있습니다.
http://codehanry.tistory.com/16 을 참고하시면 됩니다.
public FlowerAdapter(FlowerClickListener listener) { mFlowers = new ArrayList<>(); mListener = listener; } | cs |
Adapter에 쓸 ArrayList를 만들도록 합니다. 포스트들의 양이 많으므로 추가하기 쉽게 ArrayList를 사용합니다.
@Override public void onBindViewHolder(Holder holder, int position) { Flower currFlower = mFlowers.get(position); holder.mAuthor.setText(currFlower.getAuthor()); holder.mText.setText(currFlower.getText()); Glide.with(holder.itemView.getContext()) .load(currFlower.getImage()) .override(300, 300) .centerCrop() .into(holder.mImage); } | cs |
여기서 뷰홀더를 작성합니다. 뷰홀더는 Adapter에서 Holder를 가져왔으므로 onBindViewHolder를 사용할 수 있게 되었습니다. position을 가져와서 currFlower에 넣어줍니다. position 값은 recyclerView에서의 포스트 위치를 의미하는 인자입니다. 글라이드 옵션도 조절할 수 있습니다. override()를 이용해 크기와 사진의 질을 조정합니다.
다음은 포스트를 클릭할 때의 기능을 구현합니다.
public class Holder extends RecyclerView.ViewHolder implements View.OnClickListener { private ImageView mImage; private TextView mAuthor, mText; public Holder(View itemView) { super(itemView); mImage = (ImageView) itemView.findViewById(R.id.iv_photo); mAuthor = (TextView) itemView.findViewById(R.id.tv_author); mText = (TextView) itemView.findViewById(R.id.tv_text); itemView.setOnClickListener(this); } } | cs |
RecyclerView에 결합시킬 것이므로 ViewHolder를 RecyclerView에서 가져오게 됩니다. implements를 통해 onClickListener를 구현하게 됩니다.
@Override public void onClick(View view) { mListener.onClick(getLayoutPosition()); } | cs |
이 부분을 추가해줘야 합니다. 그러면 클릭시에 Position을 가져오는 기능을 담당합니다. 이런 구조에서는 Position의 위치값이 중요하게 여겨집니다. 이게 글 번호를 의미한다고 생각해도 됩니다.
3. 포스트 세부설정
@Override public int getItemCount() { return mFlowers.size(); } public void addFlower(Flower flower) { mFlowers.add(flower); notifyDataSetChanged(); } | cs |
여기서 포스트의 사이즈를 고르고 포스트의 추가를 결정합니다. 포스트의 추가는 자동적으로 이루어지게 됩니다. 앞서 설명한 infinite Scroll과 연관됩니다.
public void clear(){ mFlowers.clear(); notifyDataSetChanged(); } public Flower getSelectedFlower(int position) { return mFlowers.get(position); } | cs |
여기서 clear()는 데이터에 변화가 있을 시에 작동합니다. 혹은 변화를 줄 시에 포스트들을 초기화하는 역할을 합니다.
public interface FlowerClickListener { void onClick(int position); } |
포스트를 클릭했을 시에 위치값을 이용해 그 포스트에 관련한 동작을 수행하고 싶다면 작성합니다. interface를 통해 포스트에 추가적인 동작을 부여할 수 있습니다.
'Java' 카테고리의 다른 글
[helloworld] Java 시작하기 1 (0) | 2018.02.04 |
---|---|
[android][REST] Adapter 만들기 2 및 apiService, REST Manager 예제 (0) | 2018.02.04 |
[android] GridLayout Activity 만들기 (0) | 2018.02.04 |
[android] Registration Activity 구현 (0) | 2018.02.04 |
[android] butterknife 모듈을 이용한 LoginActivity 만들기 (0) | 2018.02.04 |