코드를 한군데 너무 몰아넣지 마시고 적절하게 분리하세요. DetailViewRecyclerViewAdapter는 별도의 파일로 분리하시는게 아주 보편적인 코드입니다. 그리고 Adapter안에서 파어이베이스 처리를 하지 마시고 Frag1에 처리하시는 것도 아주 보편적인 코드입니다.
더 정리할 부분이 있긴하지만 아래와 비슷하게 분리하시면 될 것 같구요.
public class ContentItem {
private String docId;
private boolean favourite;
//contentDTOs 필드 포함, 생성자에 contentDTOs 필드 추가
public ContentItem(String docId, boolean favourite, ...) {
this.docId = docId;
this.favourite = favourite;
...
}
public String getDocId() {
return docId;
}
public boolean isFavourite() {
return this.favourite;
}
@drawableRes
public int getFavouriteDrwableId() {
return isFavourite() ? R.drawable.ic_baseline_favorite_24 : R.drawable.ic_baseline_favorite_border_24;
}
public static List<ContentItem> from(QuerySnapshot querySnapshot) {
List<ContentItem> results = new ArrayList<>();
for(DocumentSnapshot snapshot : querySnapshot.getDocuments()){
results.add(ContentItem.from(snapshot));
}
return results;
}
public static ContentItem from(DocumentSnapshot snapshot) {
ContentDTO dto = snapshot.toObject(ContentDTO.class);
ContentItem result = ContentItem(
snapshot.getId(),
item.getFavorites().containsKey(uid),
...
);
return result;
}
}
public class DetailsFragment extends Fragment {
private View view;
private FirebaseFirestore firestore;
private RecyclerView.Adapter adapter;
private String uid ;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag1,container,false);
return view;
}
@Override
public void onViewCreated (View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupFirebase();
setupViews();
fetchDetails();
}
private void setupFirebase() {
firestore = FirebaseFirestore.getInstance();
uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
}
private void setupViews() {
RecyclerView recyclerView = view.findViewById(R.id.detailviewfragment_recyclerview);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
adapter = new DetailViewAdapter();
adapter.setListener(new object: DetailViewAdapter() {
@Override
public void onFavouriteClicked(ContentItem item) {
favouriteClicked(item);
}
});
recyclerView.setAdapter(adapter);
}
private void fetchDetails() {
firestore.collection("images")
.orderBy("timestamp").get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot querySnapshot) {
detailsFetched(querySnapshot);
}
});
}
}
private void detailsFetched(QuerySnapshot querySnapshot) {
try{
List<ContentItem> contentItems = ContentItem.from(querySnapshot);
adapter.submitList(contentItems);
}catch (Exception e){
// TODO : handleRemoteError(e);
}
}
private void favouriteClicked(ContentItem item){
DocumentReference docRef = firestore.collection("images")
.document(contentUidList.get(position));
firestore.runTransaction(new Transaction.Function<Void>() {
@Nullable
@Override
public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
ContentDTO contentDTO = transaction.get(docRef).toObject(ContentDTO.class);
if(contentDTO.getFavorites().containsKey(uid)){
contentDTO.setFavoriteCount(contentDTO.getFavoriteCount() -1);
contentDTO.getFavorites().remove(uid);
} else {
contentDTO.setFavoriteCount(contentDTO.getFavoriteCount() +1);
contentDTO.getFavorites().put(uid, true);
}
transaction.set(docRef, contentDTO);
return null;
}
});
}
}
public class DetailViewAdapter extends RecyclerView.Adapter<DetailViewAdapter.ViewHolder>{
interface Listener {
void onFavouriteClicked(ContentItem item);
}
private Listener listener;
private final List<ContentItem> items = new ArrayList<>();
public void setListener(Listener listener) {
this.listener = listener;
}
public void submitList(List<ContentItem> items) {
this.items = items;
notifyDataSetChanged();
}
@NonNull
@Override
public DetailViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_detail,parent,false);
ViewHolder holder = new ViewHolder(view, listener);
return holder;
}
@Override
public void onBindViewHolder(@NonNull DetailViewAdapter.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
holder.bind(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private ImageView profile_image;
private TextView profile_textview;
private ImageView profile_imageview_content;
private TextView favoritecounter_textview;
private TextView explain_textview;
private ImageView favrite_imageview;
private final DetailViewAdapter.Listener listener;
public ViewHolder(@NonNull View itemView, DetailViewAdapter.Listener listener) {
super(itemView);
this.profile_image = itemView.findViewById(R.id.detailviewitem_profile_image);
this.profile_textview = itemView.findViewById(R.id.detailviewitem_profile_textview);
this.profile_imageview_content = itemView.findViewById(R.id.detailviewitem_profile_imageview_content);
this.favoritecounter_textview = itemView.findViewById(R.id.detailviewitem_favoritecounter_textview);
this.explain_textview = itemView.findViewById(R.id.detailviewitem_explain_textview);
this.favrite_imageview = itemView.findViewById(R.id.detailviewitem_favrite_imageview);
this.listener = listener;
}
}
private void bind(item: ContentItem) {
profile_textview.setText(item.getUserId());
String imageUrl = item.getImageUri();
loadImage(profile_imageview_content, imageUrl);
loadImage(profile_image, imageUrl);
explain_textview.setText(item.getExplain());
favoritecounter_textview.setText("Likes " + item.getFavoriteCount());
//이미지 변경 부분
favrite_imageview.setImageResource(item.getFavouriteDrwableId());
favrite_imageview.setOnClickListener(v -> {
if (listener != null) {
listener.onFavouriteClicked(item)
}
});
}
private void loadImage(ImageView imageView, String url) {
Glide.with(itemView)
.load(url)
.into(imageView);
}
}
아이템 갱신은 즐겨찾기 숫자를 변경하신 다음, fetchDetails를 호출하거나 아니면 fetchDetails 에 addSnapshortListener를 사용하시면 되지 않을까 생각합니다.