以编程方式设置 CircularImageView 边框颜色

Setting CircularImageView border color programmatically

我正在使用 CircularImageView 库。我的 ViewHolder 中有一个 CircularImageView,我想在单击时更改它的边框颜色。

我的onBindViewHolder:

public void onBindViewHolder(ThumbnailAdapter.ViewHolder holder, int position) {
        ... //getting the relevant user from dataset and other irrelevant stuff

        if(selectedUsers.size() == 0 || selectedUsers.contains(user)) {
            holder.thumbnail.setBorderColor(R.color.selected);
        } else {
            holder.thumbnail.setBorderColor(R.color.not_selected);
        }

        holder.thumbnail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (selectedUsers.contains(user)) {
                    selectedUsers.remove(user);
                } else {
                    selectedUsers.add(user);
                }

                notifyDataSetChanged();
            }
        });
}

奇怪的是第一个着色有效(边框颜色确实不是 xml 中预定义的颜色),但是任何进一步的更改都不会影响视图(尽管事件被调用并且值改变)。我也尝试更改 drawable 以消除 RecyclerView 相关的问题,并且它按预期工作。

我做错了什么吗?也许库中有错误(如果是这样,我找不到它)?任何帮助将不胜感激!

编辑: 更多适配器代码:

public ThumbnailAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.thumbnail, parent, false);
        return new ThumbnailAdapter.ViewHolder(v);
    }

static class ViewHolder extends RecyclerView.ViewHolder {
        CircularImageView thumbnail;

        ViewHolder(View v) {
            super(v);
            thumbnail = (CircularImageView) v.findViewById(R.id.user_thumbnail);
        }
    }

private List<User> mDataSet;
private List<User> selectedUsers;

public ThumbnailAdapter(List<User> dataSet) {
        mDataSet = dataSet;
        selectedUsers = new ArrayList<>();
    }

设置适配器:

        mAdapter = new ThumbnailAdapter(users);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
        mRecyclerView.setAdapter(mAdapter);

我成功了,试试这个:

public void onBindViewHolder(RecyclerView.ViewHolder mholder, int position) {

        final User user = mList.get(position);


        final ViewHolder holder = (ViewHolder) mholder;

        if(selectedUsers.size() == 0 || selectedUsers.contains(user))
        {
            //holder.thumbnail.setBorderColor(Color.GREEN);

            setBorder(holder.thumbnail, true);
        } else {
            //holder.thumbnail.setBorderColor(Color.RED);
            setBorder(holder.thumbnail, false);

        }

        holder.thumbnail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (selectedUsers.contains(user)) {
                    selectedUsers.remove(user);
                } else {
                    selectedUsers.add(user);
                }

                //notifyItemChanged(position);
                notifyDataSetChanged();
            }
        });
    }

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

    public void setBorder(CircularImageView circularImageView, boolean selected) {

        // Set Border
        if(selected) {
            circularImageView.setBorderColor(context.getResources().getColor(R.color.colorPrimary));
            circularImageView.setBorderWidth(50);
            circularImageView.setBackgroundColor(0xffffffff);
        }
        else
        {
            circularImageView.setBorderColor(context.getResources().getColor(R.color.colorAccent));
            circularImageView.setBorderWidth(50);
            circularImageView.setBackgroundColor(0xffffffff);
        }
// Add Shadow with default param
        //circularImageView.addShadow();
// or with custom param
        //circularImageView.setShadowRadius(1);
        //circularImageView.setShadowColor(Color.WHITE);
    }

为了提高性能你应该做的其他事情:查看你的 View.OnClickListener() 开关 notifyDataSetChanged() 这将强制在 LayoutManager 上使用精确方法 [=14] 进行完整的布局=] 这将执行您想要的任务而无需重新绘制所有内容

希望对您有所帮助! =)