修改recyclerview指定位置背景色

这是一个瞎写的小说阅读器,通过点击章节列表(recyclerview)中的选项或者其它方式更新正文文本框内容,并且将章节列表中的相应view设置为红色背景(R.color.colorAccent)。

holder.chapterName是一个文本框,内容为章节名称;

holder.chapterView是holder.chapterName + 一条下划线,基本上算是同一个View

因为改变章节的方式并不只是点击,所以修改方法不在onClick方法里写。

在adapter里添加一个触发修改的方法,由外部调用(getContent方法内包含接口方法,即使点击也一样),将当前章节名称(默认不重复)和该章节在章节列表中的位置传入后再调用notifyItemChanged方法,这样就会触发onBindViewHolder。

在onBindViewHolder里判断recyclerview中的文字内容是否和当前章节名称相同,如果相同就设置为红色背景,并将lastSelectedView设置为这个view;如果不同就设置为天蓝色背景。

在每次触发onBindViewHolder时,当recyclerview中的文字内容和当前章节名称相同,如果lastSelectedView和这个view不是同一个view,说明当前章节变了,需要先把lastSelectedView的背景设置成天蓝色,再将当前view设置为红色背景,将lastSelectedView设置为这个新的view。

ps:在onBindViewHolder里如果根据position而不是章节名来设置的话,会出现这种问题:选中的章节item会变红,但是列表上下滑动会发现还有别的章节item也变红了。

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chapter_item, parent, false);
        final ViewHolder holder = new ViewHolder(view);
        holder.chapterView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getContent(holder.getAdapterPosition());
                drawerLayout.closeDrawer(GravityCompat.START);

            }
        });
        return holder;
    }
    
    public void selectItem(int position, String selectedChapter) {
        this.selectedChapter = selectedChapter;
        notifyItemChanged(position);
    }
    
    private String selectedChapter;
    private View lastSelectedView;

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String chapterName = mNovelInfo.ChapterNameList.get(position);
        holder.chapterName.setText(chapterName);
        if (chapterName.equals(selectedChapter)) {
            if (lastSelectedView != null && lastSelectedView != holder.chapterName) {
                lastSelectedView.setBackgroundColor(ContextCompat.getColor(MyUtil.activeActivity, R.color.skyblue));
            }
            holder.chapterName.setBackgroundColor(ContextCompat.getColor(MyUtil.activeActivity, R.color.colorAccent));
            lastSelectedView = holder.chapterName;
        } else {
            holder.chapterName.setBackgroundColor(ContextCompat.getColor(MyUtil.activeActivity, R.color.skyblue));
        }
    }
        简单来说,就是把上一个变色的view保存下来,需要变化的时候调用notifyItemChanged(int position)方法,并在onBindViewHolder里判断这个view和保存的view是否是同一个view,如果是就不用变,如果不是就把保存的view颜色设置为普通的颜色,把当前view设置为特殊颜色。

展开阅读全文
博主设置当前文章不允许评论。

没有更多推荐了,返回首页