Элементы RecyclerView, показывающие странное поведение пользовательского интерфейса при нажатии на ImageView - PullRequest
0 голосов
/ 21 июня 2020

У меня есть 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...