【问题标题】:Change the border of a CircleImageView in a RecyclerView在 RecyclerView 中更改 CircleImageView 的边框
【发布时间】:2019-05-09 15:45:00
【问题描述】:

我有一个水平的 RecyclerView,它显示用于选择“个人资料”图像的图像。

我正在使用 CircleImageView 使图像带有圆角,这个库可以在每个图像上放置边框。

注意一个 RecyclerViewItemLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

   <de.hdodenhof.circleimageview.CircleImageView
       android:id="@+id/avatar_select"
       android:paddingTop="5dp"
       android:layout_width="80dp"
       android:layout_height="80dp"
       android:padding="5dp"
       app:civ_border_color="@color/colorPrimary"
       app:civ_border_width="3dp"
       android:src="@drawable/avatar1"/>

</LinearLayout>

当点击一个项目时,CircleImageView 边框应该与 ColorAsset 的颜色相匹配,当点击一个新项目时(就像用户改变了他或她对“个人资料”照片的看法并想要另一张),新的item 应该收到边框并且旧的选择应该返回到 ColorPrimary。

注意一个 RecyclerViewAdapter.java

public class AvatarAdapter extends RecyclerView.Adapter<AvatarAdapter.MyViewHolder> {

private Context mContext;
private List<Avatar> mdata;


public AvatarAdapter(Context mContext, List<Avatar> mdata) {
    this.mContext = mContext;
    this.mdata = mdata;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view;
    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view = mInflater.inflate(R.layout.escolhe_avatar,parent,false);
    final MyViewHolder vHolder = new MyViewHolder(view);

    return vHolder;
}

@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {

    holder.image.setImageResource(mdata.get(position).getImage());

    holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    holder.image.setBorderColor(R.color.colorAccent);
                }
            });
        }
    });

}

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

public static class MyViewHolder extends RecyclerView.ViewHolder {

    private CircleImageView image;
    public MyViewHolder(View itemView){
        super(itemView);

        image = (CircleImageView) itemView.findViewById(R.id.avatar_select);

    }
}

}

我的脑袋已经坏了,我研究过,但我找不到解决方案,谁能帮帮我吗?

【问题讨论】:

    标签: java android android-studio android-recyclerview


    【解决方案1】:

    利用上一个答案中的逻辑,我认为每次点击时,我都应该将所有执行的项目更新为接收 ColorAccent 边缘的项目。

    Veja a minha classe onBindViewClass do meu RecyclerViewAdapter.class

     @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder,  final int position) {
    
        holder.image.setImageResource(mdata.get(position).getImage());
        holder.image.setBorderColor(getColor(mContext, R.color.colorPrimary));
    
        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.image.setBorderColor(getColor(mContext, R.color.colorAccent));
    
                for (int i=0; i <= mdata.size(); i++){
                    if (i != position){
                        notifyItemChanged(i, null);
                    }
    
                }
            }
        });
    
    }
    

    【讨论】:

      【解决方案2】:

      如果我理解正确你想做什么,这应该可以工作

       @Override
          public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
      
              holder.image.setImageResource(mdata.get(position).getImage());
              holder.image.setBorderColor(R.color.colorPrimary);
      
              holder.image.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      holder.image.setOnClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              notifyDataSetChanged();
                              holder.image.setBorderColor(R.color.colorAccent);
                          }
                      });
                  }
              });
      
          }
      

      【讨论】:

      • 这不起作用,因为通过运行 notifyDataSetChanged () 您正在更新所有项目。
      • 我认为这就是你想要的,你能澄清更多你想要做什么吗?
      • 确实是这样,不过它的代码在使用notifyDataSetChanged()时,会在ColorPrimary等所有项目的边框上加箭头,不留高亮,我设法解决了,把解决方案贴在这里,看看。
      • 很高兴您找到了解决方案。如果您发现我的回答有帮助,请随时投票:D 再次感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多