繁体   English   中英

更改RecyclerView所选项目的背景

[英]Change background of RecyclerView selected item

我有一个recylcerView,我想更改所选textview的背景颜色,如果用户点击下一个textview,之前的选择应该被删除,并且当前应该突出显示,到目前为止我所做的是它突出显示所选日期并保留前一个突出

    public void onBindViewHolder(final DateHolder holder, final int position) {
        final String monthDate = arrayListDate.get(position);
        final GradientDrawable gd = new GradientDrawable();
        gd.setShape(GradientDrawable.OVAL);
        final GradientDrawable drawable=new GradientDrawable();
        drawable.setShape(GradientDrawable.OVAL);
        if(selectedDate.contains(monthDate)){

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                drawable.setColor(Color.parseColor("#006EB9"));
                drawable.setSize(width,height);
                holder.tvDate.setTextColor(getResources().getColor(R.color.white));
                holder.tvDate.setBackground(drawable);                
             }
        }
            ViewTreeObserver viewTreeObserver = relativeLayout.getViewTreeObserver();
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {                            holder.tvDate.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        width = holder.tvDate.getMeasuredWidth();
                        height = holder.tvDate.getLineHeight();
                    } else {
                        //noinspection deprecation
                        holder.tvDate.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        width = holder.tvDate.getMeasuredWidth();
                        height= holder.tvDate.getLineHeight();
                    }

                }
            });

                holder.tvDate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        selectedDate.clear();
                        selectedDate.add(monthDate);
                        notifyItemChanged(position);

                    }
                });
        }

将全局int变量放入适配器类中,如int selectedPosition = 9999; 查看评论以获取更多信息

   public void onBindViewHolder(final DateHolder holder, final int position
  {
    final String monthDate = arrayListDate.get(position);
    final GradientDrawable gd = new GradientDrawable();
    gd.setShape(GradientDrawable.OVAL);
    final GradientDrawable drawable=new GradientDrawable();
    drawable.setShape(GradientDrawable.OVAL);
    // if its selected position change background;
    if(selectedPosition == position){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            drawable.setColor(Color.parseColor("#006EB9"));
            drawable.setSize(width,height);
            holder.tvDate.setTextColor(getResources().getColor(R.color.white));
            holder.tvDate.setBackground(drawable);                
         }
    }
        ViewTreeObserver viewTreeObserver = relativeLayout.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {                            holder.tvDate.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    width = holder.tvDate.getMeasuredWidth();
                    height = holder.tvDate.getLineHeight();
                } else {
                    //noinspection deprecation
                    holder.tvDate.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    width = holder.tvDate.getMeasuredWidth();
                    height= holder.tvDate.getLineHeight();
                }

            }
        });

            holder.tvDate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     //notify position if there was previous position
                    if(selectedPosition != 9999){
                      int temp= selectedPosition;
                      selectedPosition = position;
                      notifyItemChanged(temp);
                    }
                    else{
                       selectedPosition= position;           
                    }
                    // put new selected position

                   //notify new position
                    notifyItemChanged(position);

                }
            });
    }

我认为你的selectedDate并不优雅,你可以改为这个。

public class CustomDate {
    public String date;

    public boolean isSelected;
}

然后

public void onBindViewHolder(final DateHolder holder, final int position) {
    final CustomDate monthDate = arrayListDate.get(position);
    final GradientDrawable gd = new GradientDrawable();
    gd.setShape(GradientDrawable.OVAL);
    final GradientDrawable drawable = new GradientDrawable();
    drawable.setShape(GradientDrawable.OVAL);

    // TODO Custom some background drawable .

    if (monthDate.isSelected) {
        drawable.setColor(Color.parseColor("#006EB9"));
        holder.tvDate.setTextColor(getResources().getColor(R.color.white));
        holder.tvDate.setBackground(selectedDrawable);
    } else {
        drawable.setColor(Color.parseColor("#000000"));
        holder.tvDate.setTextColor(getResources().getColor(R.color.normal));
        holder.tvDate.setBackground(normalDrawable);
    }
    holder.tvDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            monthDate.isSelected = true;
           // notifyDataSetChanged();

           // You just need notify this item;
            notifyItemChanged(position);

        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM