땀이 삐질삐질 나는 개발 일기

안드로이드 RecyclerView Item Delete 본문

개발 Tip

안드로이드 RecyclerView Item Delete

삐질 2019. 4. 21. 23:05

이전 시간에는 Item ADD에 대해 알아보았다면 이번엔 Delete에 대해 알아봅시다.

 

Delete를 하는 것에 있어서 가장 중요한 부분은

 

리사이클러뷰는 View 와 Data 부를 따로 생각하셔야 한다는 것 입니다.

 

이게 무슨소리냐?

 

리사이클러뷰의 아이템 리스트를 Set 하고 그것을 onBindViewHolder 에서 내가 지정 한 Item View에 Data Set을 해 줄것인데 ,

 

실제로 내가 ItemList의 특정 리스트는 지웠어도 , View는 변경이 되지 않습니다. 이유는 View를 다시 그려줘야하기 때문인데요

( 한 마디로 Data와 View의 동기화 작업 )

 

아래 코드로 보시죠.

 

플로우는 아래와 같습니다.

 

준비물 : ItemEntity( 아이템 리스트) , Recyclerview , MainActivity

 

- ItemEntity는 내가 리스트에 나타내주고 싶은 Item의 타이틀과 / 체크여부를 기억하는 Data Entity입니다.

 

MainActivity.java

public class ItemAdapter extends RecyclerView.Adapter {

private Context context;
private List<ItemEntity> itemList;

public ItemAdapter(Context context, List<ItemEntity> itemList) {
    this.context = context;
    this.itemList = itemList;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);
    return new ItemViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ItemViewHolder) { //홀더 타입 검사
        ItemEntity itemEntity = itemList.get(position);
        ((ItemViewHolder) holder).title.setText(itemEntity.getTitle());
        Log.e("타이틀", "" + itemEntity.getTitle());
        if (itemEntity.isClicked()) { //이 조건문 쌍이 매우 중요함 반드시  true / false  각 반대의 상황 모두의 view 상태를 set 해줘야함
            ((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_24px);
        } else { //그렇지 않으면, 어떤일이 벌어지는 지는 본인이 테스트해보시면 참 좋을 것으로 예상됨.
            ((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_outline_24px);

        }
    }

}



@Override
public int getItemCount() {
    return itemList.size(); //아이템리스트가 null 이면 사이즈는 0 반환 / 아니면 사이즈만큼 반환
}

public List<ItemEntity> getItemList() {
    return itemList;
}

public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView title;
    private Button click;

    public ItemViewHolder(@NonNull View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.text_title);
        click = itemView.findViewById(R.id.check_btn);
        click.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.check_btn:
                boolean isClicked = itemList.get(getAdapterPosition()).isClicked();
                itemList.get(getAdapterPosition()).setClicked(!isClicked);
                notifyItemChanged(getAdapterPosition());
                break;
        }
    }
}
}

ItemEntity.java

 public class ItemEntity {
    private String title;
    private boolean isClicked;
public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public boolean isClicked() {
    return isClicked;
}

public void setClicked(boolean clicked) {
    isClicked = clicked;
}

ItemAdapter.java

public class ItemAdapter extends RecyclerView.Adapter {

    private Context context;
    private List itemList;

    public ItemAdapter(Context context, List itemList) {
        this.context = context;
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemViewHolder) { //홀더 타입 검사
            ItemEntity itemEntity = itemList.get(position);
            ((ItemViewHolder) holder).title.setText(itemEntity.getTitle());
            Log.e("타이틀", "" + itemEntity.getTitle());
            if (itemEntity.isClicked()) { //이 조건문 쌍이 매우 중요함 반드시  true / false  각 반대의 상황 모두의 view 상태를 set 해줘야함
                ((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_24px);
            } else { //그렇지 않으면, 어떤일이 벌어지는 지는 본인이 테스트해보시면 참 좋을 것으로 예상됨.
                ((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_outline_24px);

            }
        }

    }


    @Override
    public int getItemCount() {
        return itemList.size(); //아이템리스트가 null 이면 사이즈는 0 반환 / 아니면 사이즈만큼 반환
    }

    public List getItemList() {
        return itemList;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView title;
        private Button click;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.text_title);
            click = itemView.findViewById(R.id.check_btn);
            click.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id) {
                case R.id.check_btn:
                    boolean isClicked = itemList.get(getAdapterPosition()).isClicked();
                    itemList.get(getAdapterPosition()).setClicked(!isClicked);
                    notifyItemChanged(getAdapterPosition());
                    break;
            }
        }
    }
}

Comments