У меня есть recyclerview во фрагменте, который содержит элементы данных, полученные из RestAPI. При щелчке по значку закладки вместо изменения только чертежа выбранного изображения он также меняет чертежи других изображений. Я проверил журналы, и он показывает, что onBindViewHolder вызывается для нескольких позиций, а не только для одной. 0, он также обновляет другие элементы, и каким-то образом изменяются изображения этих элементов.
Журналы странного поведения
У меня адаптер такой:
public class RecyclerAdapterResources extends RecyclerView.Adapter<RecyclerAdapterResources.DetailViewHolder> {
private Context mCtx;
private List<getAllResourcesResponse> resourceList;
//<ResourceID, BookmarkID>
private HashMap<Integer, Integer> bookmarkedResources;
private ViewModel viewModel;
private academicRepository repository= new academicRepository();
private getAllResourcesResponse tempForStudyMaterial;
public void setDataSet(List<getAllResourcesResponse> resp) {
this.resourceList = resp;
notifyDataSetChanged();
}
public RecyclerAdapterResources(){}
public RecyclerAdapterResources(Context mctx, List<getAllResourcesResponse> resp){
super();
this.mCtx=mctx;
this.resourceList=resp;
viewModel = ViewModelProviders.of((FragmentActivity) this.mCtx).get(ViewModel.class);
bookmarkedResources = new HashMap<>();
setBookmarkedResources(bookmarkedResources);
}
public RecyclerAdapterResources(Context mctx, List<getAllResourcesResponse> resp, String viewbookmarkedresources){
super();
this.mCtx=mctx;
this.resourceList=resp;
viewModel = ViewModelProviders.of((FragmentActivity) mCtx).get(ViewModel.class);
bookmarkedResources = new HashMap<>();
setBookmarkedResources(bookmarkedResources);
}
private void setBookmarkedResources(final HashMap<Integer, Integer> bookmarkedResources) {
viewModel.getAllBookmarkedResources(getUserId());
viewModel.getAllBookmarkedResourcesResponseLiveData().observe((LifecycleOwner) mCtx, new Observer<GetAllBookmarkedResourcesResponse>() {
@Override
public void onChanged(GetAllBookmarkedResourcesResponse getAllBookmarkedResourcesResponse) {
int i = 0;
//Log.d("SAs", "onChanged: " + getAllBookmarkedResourcesResponse.getType());
if (getAllBookmarkedResourcesResponse.getResources()!=null) {
if (getAllBookmarkedResourcesResponse.getType().equals("Success")) {
while (i < getAllBookmarkedResourcesResponse.getResources().size()) {
//Log.d("SAs", "onChanged: " + "called");
bookmarkedResources.put(getAllBookmarkedResourcesResponse.getResources().get(i).getResource().getResourceId(), getAllBookmarkedResourcesResponse.getResources().get(i).getBookmarkId());
i++;
}
}
}
}
});
}
@NonNull
@Override
public DetailViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.each_resource_display,parent,false);
return new DetailViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final RecyclerAdapterResources.DetailViewHolder holder, final int position) {
Log.d("BOOKMARK", "onBindViewHolder: " + position);
getAllResourcesResponse temp= resourceList.get(position);
holder.title_tv.setText(temp.getTitle());
holder.created_on_tv.setText(temp.getUploadedAt().replace('T',' ').substring(0,19));
holder.description_tv.setText(temp.getDes());
String linkUrl=resourceList.get(position).getLinkURL();
if(linkUrl.startsWith("https://www.youtube.com/watch?v=")|| linkUrl.startsWith("https://youtu.be/") || linkUrl.startsWith("https://m.youtube.com/watch?v=")){
holder.resource_type_icon.setBackgroundResource(R.drawable.youtube);
holder.res_icon.setBackgroundResource(R.drawable.ic_link);
//Log.d("repo ","thumbnail is "+resourceList.get(position).getThumbnailUrl());
Picasso.get()
.load("https://img.youtube.com/vi/"+resourceList.get(position).getThumbnailUrl()+"/hqdefault.jpg")
.fit()
.centerCrop()
.into(holder.img_iv);
// //Log.d("repo "," its utube video and thumbnail is "+"https://img.youtube.com/vi/"+resourceList.get(position).getThumbnailUrl()+"/hqdefault.jpg");
}
if(resourceList.get(position).getUploadedFile().contains(".pdf")){
holder.resource_type_icon.setBackgroundResource(R.drawable.pdf_icon_48);
holder.res_icon.setBackgroundResource(R.drawable.file);
holder.img_iv.setLayoutParams(new ConstraintLayout.LayoutParams(0, 0));
holder.img_iv.setVisibility(View.GONE);
}
if(resourceList.get(position).isValidImage()){
holder.res_icon.setBackgroundResource(R.drawable.file);
holder.resource_type_icon.setBackgroundResource(R.drawable.ic_image_icon);
holder.img_iv.setVisibility(View.VISIBLE);
}
else{
holder.img_iv.setVisibility(View.VISIBLE);
if(linkUrl.contains("https://www.youtube.com/watch?v=")|| linkUrl.contains("https://youtu.be/") || linkUrl.startsWith("https://m.youtube.com/watch?v=")){
holder.res_icon.setBackgroundResource(R.drawable.ic_link);
holder.resource_type_icon.setBackgroundResource(R.drawable.youtube);
}else if(!resourceList.get(position).getUploadedFile().contains(".pdf")){
holder.res_icon.setBackgroundResource(R.drawable.ic_link);
holder.img_iv.setLayoutParams(new ConstraintLayout.LayoutParams(0, 0));
holder.resource_type_icon.setBackgroundResource(R.drawable.web_icon);
}
}
if(resourceList.get(position).isValidImage()){
Picasso.get()
.load(resourceList.get(position).getUploadedFile())
.fit()
.centerCrop()
.into(holder.img_iv);
}
if (bookmarkedResources.containsKey(Integer.valueOf(resourceList.get(position).getResourceId()))) {
resourceList.get(position).setBookmarked(true);
holder.bookmark_btn.setImageDrawable(holder.bookmark_btn.getResources().getDrawable(R.drawable.bookmark_icon));
} else {
holder.bookmark_btn.setImageDrawable(holder.bookmark_btn.getResources().getDrawable(R.drawable.bookmark_icon_not));
}
holder.bookmark_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String uuid = getUserId();
//Log.d("sasad", "onClick: " + uuid);
if (!resourceList.get(position).isBookmarked()){
viewModel.createResourceBookmark(resourceList.get(position).getResourceId(), uuid);
viewModel.getCreateResourceBookmarkResponseLiveData().observe((LifecycleOwner) holder.bookmark_btn.getContext(), new Observer<CreateResourceBookmarkResponse>() {
@Override
public void onChanged(CreateResourceBookmarkResponse createResourceBookmarkResponse) {
if (createResourceBookmarkResponse!=null) {
if (createResourceBookmarkResponse.getType().equals("Success")) {
//holder.bookmark_btn.setImageDrawable(holder.bookmark_btn.getResources().getDrawable(R.drawable.bookmark_icon));
bookmarkedResources.put(Integer.parseInt(resourceList.get(position).getResourceId()), createResourceBookmarkResponse.getResources().getBookmarkId());
resourceList.get(position).setBookmarked(true);
notifyItemChanged(position);
} else {
Toast.makeText(mCtx, createResourceBookmarkResponse.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
});
}
else{
viewModel.deleteResourceBookmark(String.valueOf(bookmarkedResources.get(Integer.parseInt(resourceList.get(position).getResourceId()))), uuid);
viewModel.getDeleteResourceBookmarkResponseLiveData().observe((LifecycleOwner) holder.bookmark_btn.getContext(), new Observer<CreateResourceBookmarkResponse>() {
@Override
public void onChanged(CreateResourceBookmarkResponse deleteResourceBookmarkResponse) {
if (deleteResourceBookmarkResponse!=null) {
if (deleteResourceBookmarkResponse.getType().equals("Deleted")) {
bookmarkedResources.remove(Integer.parseInt(resourceList.get(position).getResourceId()));
// holder.bookmark_btn.setImageDrawable(holder.bookmark_btn.getResources().getDrawable(R.drawable.bookmark_icon_not));
resourceList.get(position).setBookmarked(false);
notifyItemChanged(position);
} else {
Toast.makeText(mCtx, deleteResourceBookmarkResponse.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
});
}
@Override
public int getItemCount() {
return resourceList.size();
}
public class DetailViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView title_tv,description_tv,created_on_tv;
ImageView img_iv,resource_type_icon,res_icon,edit_btn, bookmark_btn;
long bookmarkId;
public DetailViewHolder(@NonNull View itemView) {
super(itemView);
res_icon=itemView.findViewById(R.id.resource_icon);
title_tv=itemView.findViewById(R.id.title_tv);
description_tv=itemView.findViewById(R.id.description_id);
created_on_tv=itemView.findViewById(R.id.create_on);
img_iv=itemView.findViewById(R.id.resource_img);
resource_type_icon=itemView.findViewById(R.id.resource_type_icon);
edit_btn=itemView.findViewById(R.id.edit_btn);
bookmark_btn = itemView.findViewById(R.id.bookmark_btn);
bookmarkId = 0;
if(getusertype().equals("teacher")) {
edit_btn.setOnClickListener(this);
//bookmark_btn.setVisibility(View.GONE);
}
else{
edit_btn.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
// Toast.makeText(mCtx, resourceList.get(getAdapterPosition()).getTitle() +" is the title ", Toast.LENGTH_SHORT).show();
// generate the intent
String url=resourceList.get(getAdapterPosition()).getLinkURL();
Intent intent= new Intent(mCtx, resourceEdit.class);
boolean isUrl=false;
if(url!=null)
if(url.startsWith("www.") || url.startsWith("http")){
isUrl=true;
}
intent.putExtra("resource_info",resourceList.get(getAdapterPosition()));
intent.putExtra("isUrl",isUrl);
mCtx.startActivity(intent);
}
}
String getUserId(){
SharedPreferences sh
= mCtx.getSharedPreferences(userDetails.sharedPrefs,
MODE_PRIVATE);
return sh.getString(userDetails.userId, "");
}
private void downloadFile(String url) {
Repository repository = Repository.getInstance();
repository.downloadFile(url, mCtx, -1,false);
}
private void trans(String resourceId,String urlPdf){
Intent intent = new Intent(mCtx, PDFActivity.class);
intent.putExtra("callFromResource","yes");
intent.putExtra("resourceId",resourceId);
intent.putExtra("urlForPDF",urlPdf);
mCtx.startActivity(intent);
}
private String getusertype(){
SharedPreferences sh
= mCtx.getSharedPreferences(userDetails.sharedPrefs,MODE_PRIVATE);
return sh.getString(userDetails.userType, "");
}
@Override
public int getItemViewType(int position) {
return position;
}
}