以编程方式设置 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] 进行完整的布局=] 这将执行您想要的任务而无需重新绘制所有内容
希望对您有所帮助! =)
我正在使用 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] 进行完整的布局=] 这将执行您想要的任务而无需重新绘制所有内容
希望对您有所帮助! =)