SetBackground只能在cardview中的一个texview中同时更改两个背景

时间:2016-08-11 14:18:09

标签: android android-recyclerview android-cardview

我正在更改onBindViewHolder中第一个textview(位置0)的背景

这是我的RecyclerAdapter

public class MenuCardAdapter extends RecyclerView.Adapter<MenuCardAdapter.MenuCardViewHolder> {



 //Context and Reference Parent
    private Context context;
    private List<MenuCard> objects;
    private ItemOnCardviewMenu listener;

     MenuCardViewHolder holder = null;

    public MenuCardAdapter(Context context , List<MenuCard> objects, ItemOnCardviewMenu listener) {
        this.context = context;
        this.objects = objects;
        this.listener = listener;
    }




    @Override
    public MenuCardAdapter.MenuCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_card, parent, false);
        MenuCardViewHolder vHolder = new MenuCardViewHolder(v,this.listener);
        return  vHolder;

    }

    public MenuCard getItem(int position) {
        return objects.get(position);
    }




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

        holder.title.setText(objects.get(position).getmTexto());
        holder.id.setText(objects.get(position).getmId());
        if(position==0){
            holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
        }
        this.holder = holder;

    }


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




    class MenuCardViewHolder extends RecyclerView.ViewHolder

    {

        TextView title;
        TextView id;
        CardView card;
        public MenuCardViewHolder(final View itemView, final ItemOnCardviewMenu listener) {
            super(itemView);

            id = (TextView) itemView.findViewById(R.id.id_card);
            title = (TextView) itemView.findViewById(R.id.card_text);
            card = (CardView) itemView.findViewById(R.id.card_view);
            card.setTag(this.card);

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

                    if(listener != null){

                        listener.onRowClicked(getAdapterPosition(), v, card, id.getText().toString());


                    }
                }
            });
        }
    }
}

这部分是我改变背景的地方

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

    holder.title.setText(objects.get(position).getmTexto());
    holder.id.setText(objects.get(position).getmId());
    if(position==0){
        holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
    }
    this.holder = holder;

}

但是当我运行应用程序看起来像这个菜单pos 0。 menu pos 0

但同时位置8改变其颜色 菜单pos 7 menu pos 7

我不知道为什么会发生这种情况,只要点击“选项2”,“选项9”也会改变背景。

提前谢谢。

4 个答案:

答案 0 :(得分:1)

你必须放置else case,因为它重用了对象(视图持有者模式)。

 if(position==0){
    holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
}
 else{
    holder.title.setBackgroundColor(context.getResources().getColor(some other color));
}

答案 1 :(得分:0)

ListView重用项目,否则也需要条件。否则你将面临这样的行为。滚动的第0个位置项目在外面,并查看其他列表项目重复使用以供显示。所以已经为其他项目设置了背景显示。

答案 2 :(得分:0)

使用

if(position == 0){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   holder.title.setBackgroundColor(context.getResources().getColor(R.color.black, context.getTheme()));
}else{
    holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
}
else{
 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    holder.title.setBackgroundColor(context.getResources().getColor(R.color.green,  context.getTheme()));
}else{
     holder.title.setBackgroundColor(context.getResources().getColor(R.color.green));
     }
 }

这是因为在API 23及以上版本中不推荐使用 getColor(int id),如果api级别为23,则应使用 getColor(int id,Theme theme)或更高

答案 3 :(得分:0)

由于

,我可以解决我的问题
  

Prashanth Debbadwar提出你的建议

这就是模拟菜单的方法

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

    holder.title.setText(objects.get(position).getmTexto());
    holder.id.setText(objects.get(position).getmId());
    if(position==posOption){
        holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
    }
    else{
        holder.title.setBackgroundColor(context.getResources().getColor(R.color.colorPrimary));
    }

    holder.title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if(posOption != position){
              holder.title.setBackgroundColor(context.getResources().getColor(R.color.black));
              posOption = position;

          }else {
              holder.title.setBackgroundColor(context.getResources().getColor(R.color.colorPrimary));
          }

        notifyDataSetChanged();


        }
    });

    this.holder = holder;

}

我也从活动

中删除界面