Recycerview更改了错误的物品

时间:2019-02-12 23:49:20

标签: java android

这是我的recyclerview适配器类

    public class WebsiteAdapter extends RecyclerView.Adapter<WebsiteAdapter.WebsiteHolder> {
    private List<Website> websites = new ArrayList<>();
    private WebsiteViewModel websiteViewModel;

    WebsiteAdapter(WebsiteViewModel viewModel){
        this.websiteViewModel = viewModel;
    }


    @NonNull
    @Override
    public WebsiteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.website_item, parent, false);
        return new WebsiteHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull final WebsiteHolder holder, final int position) {
        final Website currentWebsite = websites.get(position);
        final Boolean bookmarkStatus = currentWebsite.getFavourite();
        final List<WebPage> webPages = websiteViewModel.getRepository().getAllWebPagesForWebsite(currentWebsite.getWebsite_id());

        holder.textViewTitle.setText(currentWebsite.getWebsiteName());

        if(currentWebsite.getDescription() != null){
            holder.textViewDescription.setText(currentWebsite.getDescription());
            holder.textViewDescription.setVisibility(View.VISIBLE);
        }

        if(webPages!=null && !webPages.isEmpty()) {
            holder.secondaryAdapter.setWebPages(webPages);
            holder.expandCollapse.setVisibility(View.VISIBLE);
        }

        if(bookmarkStatus){
            holder.isBookmarked = true;
            holder.bookmarkButton.setBackgroundResource(R.drawable.ic_bookmark_24px);
        } else {
            holder.isBookmarked = false;
            holder.bookmarkButton.setBackgroundResource(R.drawable.ic_bookmark_border_24px);
        }

        holder.cardViewWebsite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String websiteUrl = currentWebsite.getWebsite_url();
                System.out.println("Description =  " + currentWebsite.getDescription() + ", boomarked : " + currentWebsite.getFavourite());
                List<WebPage> webPages = websiteViewModel.getRepository().getAllWebPagesForWebsite(currentWebsite.getWebsite_id());
                for(WebPage webPage : webPages){
                    System.out.println("Web pages: ");
                    System.out.println(webPage.toString() + ", ");
                }

                launchWebsite(v.getContext(), websiteUrl);
            }
        });

        holder.bookmarkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("Website bookmarked before click : " + bookmarkStatus + ", Description is : " + currentWebsite.getDescription());
                currentWebsite.setFavourite(!bookmarkStatus);
                System.out.println("Website bookmark clicked, status has been set to : " + currentWebsite.getFavourite());
                websiteViewModel.getRepository().websiteDao.updateWebsite(currentWebsite);
                notifyItemChanged(position);
            }
        });
    }

    private void launchWebsite(Context context, String URL) {
        CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
        builder.setStartAnimations(context, R.anim.push_off_screen_left, R.anim.push_onto_screen_from_right);
        builder.setExitAnimations(context, R.anim.push_onto_screen_from_left, R.anim.push_off_screen_right);
        CustomTabsIntent customTabsIntent = builder.build();
        customTabsIntent.launchUrl(context,Uri.parse(URL));
    }

    @Override
    public int getItemCount() {
        return websites.size();
    }

    public void setWebsites(List<Website> websites) {
        this.websites = websites;
        notifyDataSetChanged();
    }

    class WebsiteHolder extends RecyclerView.ViewHolder {
        private TextView textViewTitle;
        private TextView textViewDescription;
        private CardView cardViewWebsite;
        private boolean isBookmarked; // ALSO FAVOURITED
        private boolean isExpanded = false;
        private Button expandCollapse;
        private Button bookmarkButton;
        private SecondaryAdapter secondaryAdapter;
        private RecyclerView childRecyclerView;
    public WebsiteHolder(View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.text_view_title);
        textViewDescription = itemView.findViewById(R.id.text_view_description);
        cardViewWebsite = itemView.findViewById(R.id.cardViewWebsite);
        bookmarkButton = itemView.findViewById(R.id.bookmarkButton);
        childRecyclerView = itemView.findViewById(R.id.childRecyclerview);
        expandCollapse = itemView.findViewById(R.id.expandCollapse);

        expandCollapse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isExpanded) {
                    collapseView();
                } else {
                    expandView();
                }
            }
        });

        childRecyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext(),  LinearLayoutManager.HORIZONTAL, false));
        LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(itemView.getContext(), R.anim.layout_animation_slide_in);
        childRecyclerView.setLayoutAnimation(animation);
        childRecyclerView.setHasFixedSize(true);
        secondaryAdapter = new SecondaryAdapter();
        childRecyclerView.setAdapter(secondaryAdapter);
    }
    private void collapseView() {
        isExpanded = false;
        childRecyclerView.setVisibility(View.GONE);
    }

    private void expandView() {
        isExpanded = true;
        childRecyclerView.setVisibility(View.VISIBLE);
    }
}

}

我遇到的问题是,当我按项目A上的书签按钮时:另一个项目上的展开按钮将在不应该出现时出现。 B:secondaryRecyclerView被设置为其他网站。我该如何调试呢?有什么东西像个坏蛋一样跳出来吗?我觉得自己在错误的地方放了东西。非常感谢

1 个答案:

答案 0 :(得分:1)

wrong item changes in recyclerview 多亏了这篇文章,我一个添加了bindView方法,并2:添加了ELSE语句来否定if语句。解决的问题:)暂时:)