java - Recyclerview 更改了错误的项目

标签 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 被设置为其他网站。我该如何调试这个?有什么罪魁祸首吗?我觉得我把一些东西放在了错误的地方。非常感谢

最佳答案

wrong item changes in recyclerview 感谢这篇文章,我一,添加了一个 bindView 方法,二:添加了 ELSE 语句来否定 if 语句。问题已解决:) 现在:)

关于java - Recyclerview 更改了错误的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660459/

相关文章:

java - 使用广度优先搜索找到最短路径节点

java - 如何使用 jexcelapi 或 Apache HSSF 跟踪更改

android - 为什么隐藏软键盘后EditText不会失去焦点?

android - 如何使用新的 Dropbox API 下载文件?

java - 如何从一串数字之间没有空格的数字中找到缺失的数字?

java - AspectJ 就像 C++ 中的注解?

Android 4.2.2 USB 调试 "Always allow from this computer"选项导致设备目标未知?

android - 其他 Activity 类中的方法

java - Scala:类中的公共(public)静态最终

android - 升级具有多个表的Android应用程序数据(不破坏未受影响的表)