지난 포스트들에서 자주 사용된 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(300300)
                .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);
    }

cs


포스트를 클릭했을 시에 위치값을 이용해 그 포스트에 관련한 동작을 수행하고 싶다면 작성합니다. interface를 통해 포스트에 추가적인 동작을 부여할 수 있습니다.

+ Recent posts