Java 在循环视图中,如何通过单击和不单击始终高亮显示一个适配器项

Java 在循环视图中,如何通过单击和不单击始终高亮显示一个适配器项,java,android,android-recyclerview,Java,Android,Android Recyclerview,在这里,我点击了项目,以改变项目的背景和颜色。我已将单击的项值存储在数据库中,并更改布局颜色和文本颜色,重新创建适配器,并在刷新时再次显示列表。 但是当我得到它的位置时,布局颜色并没有改变。请始终显示处理背景项目颜色集的正确路径 public class LoadVehicleTypeAdapter extends RecyclerView.Adapter<LoadVehicleTypeAdapter.CarTypesHolder> { private List<Ta

在这里,我点击了项目,以改变项目的背景和颜色。我已将单击的项值存储在数据库中,并更改布局颜色和文本颜色,重新创建适配器,并在刷新时再次显示列表。 但是当我得到它的位置时,布局颜色并没有改变。请始终显示处理背景项目颜色集的正确路径

public class LoadVehicleTypeAdapter extends RecyclerView.Adapter<LoadVehicleTypeAdapter.CarTypesHolder> {

    private List<TaxiTypeResponse.Message> CarTypesModelsList;
    private Context mContext;
    VehicleTypeView vehicleTypeView;
    int I = -1;
    int idd = 0;
    int II = 0;
    Activity activity;
    GoogleMap map;
    List<VehicleClick> list;

    private SparseBooleanArray selectedItems;

    public class CarTypesHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public CustomTextView mCarType;
        public CircleImageView mCarTypeImage;
        LinearLayout llRoot;
        CardView cardView;
        setOnitemclick listener;

        public void setOnItemClickListner(setOnitemclick listener) {
            this.listener = listener;
        }

        public CarTypesHolder(View view) {
            super(view);

            mCarType = (CustomTextView) view.findViewById(R.id.frag_cartypes_inflated_name);
            mCarTypeImage = (CircleImageView) view.findViewById(R.id.frag_cartype_inflated_frameImage);
            llRoot = (LinearLayout) view.findViewById(R.id.root1);
            selectedItems = new SparseBooleanArray();
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            listener.ImageClick(v, getAdapterPosition());
        }
    }

    public LoadVehicleTypeAdapter(Context context, List<TaxiTypeResponse.Message> CarTypesModelsList, VehicleTypeView vehicleTypeView, Activity activity, GoogleMap map, List<VehicleClick> lists) {

        this.CarTypesModelsList = CarTypesModelsList;
        mContext = context;
        this.vehicleTypeView = vehicleTypeView;
        this.activity = activity;
        this.map = map;
        this.list = lists;
    }

    @Override
    public CarTypesHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.frag_cartype_inflated_view, parent, false);
        return new CarTypesHolder(itemView);
    }

    @SuppressLint("ResourceType")
    @Override
    public void onBindViewHolder(final CarTypesHolder holder, int position) {


        if (list.size() != 0) {
            II = Integer.parseInt(list.get(0).RideId);
            //setSelection(Integer.parseInt(list.get(0).RideId));
        }

        if (II == position) {
            holder.llRoot.setBackgroundColor(Color.parseColor("#999999"));
            holder.mCarType.setTextColor(Color.parseColor("#FFFFFF"));
        } else {
            holder.llRoot.setBackgroundColor(Color.parseColor("#f3f3f3"));
            holder.mCarType.setTextColor(Color.parseColor("#2196F3"));
        }

        SharedPreferences sharedPreferences = activity.getSharedPreferences("mSelected", Context.MODE_PRIVATE);
        TaxiTypeResponse.Message carTypesModel = CarTypesModelsList.get(position);
        holder.mCarType.setText(carTypesModel.getName());
        holder.mCarTypeImage.setBackgroundResource(R.drawable.wait);
        int color = Color.parseColor(PreferenceHandler.readString(mContext, PreferenceHandler.SECONDRY_COLOR, "#006fb6"));
        holder.mCarType.setTextColor(color);

        holder.setOnItemClickListner(new setOnitemclick() {
            @Override
            public void ImageClick(View v, int position1) {
                I = position1;
                notifyDataSetChanged();
                try {
                    if (list.size() != 0) {
                        VehicleTypeFragment.myAppRoomDataBase.userDao().delete();
                        list.clear();
                    }
                    VehicleClick vehicleClick = new VehicleClick();
                    vehicleClick.setRideId(String.valueOf(position1));
                    VehicleTypeFragment.myAppRoomDataBase.userDao().insert(vehicleClick);
                    list.add(vehicleClick);
                } catch (Exception e) {

                }

            }
        });

        if (I == position) {
            holder.llRoot.setBackgroundColor(Color.parseColor("#999999"));
            holder.mCarType.setTextColor(Color.parseColor("#ffffff"));
            Animation bounce = AnimationUtils.loadAnimation(mContext, R.anim.bounce);
            holder.llRoot.startAnimation(bounce);
        } else {
            holder.llRoot.setBackgroundColor(Color.parseColor("#f3f3f3"));
            holder.mCarType.setTextColor(Color.parseColor("#2196F3"));
        }

        Picasso.with(mContext).load(carTypesModel.getImagePath()).into(holder.mCarTypeImage);
    }

    @Override
    public long getItemId(int position) {
        return CarTypesModelsList.get(position).getID();
    }

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

    public void setSelection(int position) {
        II = position;
        //notifyDataSetChanged();
    }

    public interface setOnitemclick {
        void ImageClick(View view, int position);
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

我不知道你刷新列表是什么意思。我猜您正在重新创建适配器,并在刷新时再次显示列表。因此,每次创建适配器时,I的值都初始化为-1

您需要按如下方式进行初始化。请考虑以下是一个伪代码,你需要自己实现这一点。p>
// While declaring your I 
// int I = -1;
int I = getTheStoredValueFromDatabase(); // If there is no entry in database, getTheStoredValueFromDatabase function will return -1

我希望你能明白。您可以考虑对其他存储的值执行同样的操作。 要保持跟踪记录,您需要在TaxiTypeResponse中添加布尔变量。消息布尔isClick=false;并将其切换到

holder.setOnItemClickListner(new setOnitemclick() {

    @Override
    public void ImageClick(View v, int position) {
           CarTypesModelsList.get(position).isClick=!CarTypesModelsList.get(position).isClick;
           notifyDataSetChanged();
   }
}
并修改下面的代码如下

 if (CarTypesModelsList.get(position).isClick) {

        holder.llRoot.setBackgroundColor(Color.parseColor("#999999"));
        holder.mCarType.setTextColor(Color.parseColor("#ffffff"));
        Animation bounce = AnimationUtils.loadAnimation(mContext, R.anim.bounce);
        holder.llRoot.startAnimation(bounce);

 } 
 else{
        holder.llRoot.setBackgroundColor(Color.parseColor("#f3f3f3"));
        holder.mCarType.setTextColor(Color.parseColor("#2196F3"));
 }
注意:onBindViewHolder不是实现单击的地方 侦听器,但我只是为您提供如何实现的逻辑 recyclerView中的单个选择

现在让我们跳到解决方案, 只需遵循以下教程并根据需要更改变量、字段和背景,就必须在RecyclerView的onBindViewHolder方法中实现以下方法

首先,初始化lastClickedPosition并单击

    int lastPositionClicked = -1;
     boolean isClicked = false;

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

    holder.YOUR_VIEW.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // store the position which you have just clicked and you will change the background of this clicked view
            lastPositionClicked = position;
            isClicked = true;

            // need to refresh the adapter
            SlabAdapter.this.notifyDataSetChanged();
        }
    });

    // only change the background of last clicked item 
    if (isClicked && position == lastPositionClicked) {
        // change clicked view background color
    } else {
        // otherwise set the default color for all positions

    }
}

让我知道这是否有效。

在BindViewHolder方法中,您将使用此代码并全局设置I=0

  @SuppressLint("ResourceType")
@Override
public void onBindViewHolder(final CarTypesHolder holder, int position) {

    SharedPreferences sharedPreferences = activity.getSharedPreferences("mSelected", Context.MODE_PRIVATE);
    TaxiTypeResponse.Message carTypesModel = CarTypesModelsList.get(position);
    holder.mCarType.setText(carTypesModel.getName());
    holder.mCarTypeImage.setBackgroundResource(R.drawable.wait);
    int color = Color.parseColor(PreferenceHandler.readString(mContext, PreferenceHandler.SECONDRY_COLOR, "#006fb6"));
    holder.mCarType.setTextColor(color);

    holder.setOnItemClickListner(new setOnitemclick() {
        @Override
        public void ImageClick(View v, int position1) {
            I = position1;
            notifyDataSetChanged();
            try {
                if (list.size() != 0) {
                    VehicleTypeFragment.myAppRoomDataBase.userDao().delete();
                    list.clear();
                }
                VehicleClick vehicleClick = new VehicleClick();
                vehicleClick.setRideId(String.valueOf(position1));
                VehicleTypeFragment.myAppRoomDataBase.userDao().insert(vehicleClick);
                list.add(vehicleClick);
            } catch (Exception e) {

            }

        }
    });

    if (I == position) {
        holder.llRoot.setBackgroundColor(Color.parseColor("#999999"));
        holder.mCarType.setTextColor(Color.parseColor("#ffffff"));
        Animation bounce = AnimationUtils.loadAnimation(mContext, R.anim.bounce);
        holder.llRoot.startAnimation(bounce);
    } else {
        holder.llRoot.setBackgroundColor(Color.parseColor("#f3f3f3"));
        holder.mCarType.setTextColor(Color.parseColor("#2196F3"));
    }

    Picasso.with(mContext).load(carTypesModel.getImagePath()).into(holder.mCarTypeImage);
}

请共享适配器的代码。这将帮助您快速获得答案。@Reaz请检查代码是的,我做了同样的事情,我得到了存储值,但没有更改背景相同的代码用于单击项目及其高亮显示我需要重新创建适配器时,没有选择任何项目,然后选择始终是回收器适配器上的第一个项目图像单击查看v,int position 1在代码中有一行代码,您正在实现setOnItemClickListener,在这个click listener中,您正在使用position1并将其分配给I,而不是将position分配给I,而不是position1,因为当您进行比较时,您使用的是position I==position,您是对的,但我将使用ImageClickView v,int position1将I变量设置为单击项位置。下一步,我将其与上的所有项目进行比较bindholder@Overridepublic void onClickView v{listener.ImageClickv,getAdapterPosition;}这里getAdapterPosition将始终为您提供列表中最后一项的位置,您的位置将变得混乱