【问题标题】:In Recycle view how to Highlight always one adapter item with the click and without click在回收视图中,如何通过单击和不单击始终突出显示一个适配器项
【发布时间】:2018-12-17 10:02:34
【问题描述】:

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

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;
    }
}

【问题讨论】:

  • 请分享您的适配器代码。这将帮助您快速获得答案。
  • @Reaz 请检查代码

标签: java android android-recyclerview


【解决方案1】:

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

您需要按如下方式进行初始化。请考虑以下是伪代码,您需要自己实现它。

// While declaring your I 
// int I = -1;
int I = getTheStoredValueFromDatabase(); // If there is no entry in database, getTheStoredValueFromDatabase function will return -1

我希望你能明白。您可能会考虑对其他存储值执行相同的操作。

【讨论】:

  • 是的,我做同样的事情,我得到了存储的值,但没有改变背景
【解决方案2】:

为了保持跟踪记录,您需要在 TaxiTypeResponse.Message boolean 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"));
 }

【讨论】:

    【解决方案3】:

    注意:onBindViewHolder() 不是实现点击的地方 听众,但我只是为您提供如何实现的逻辑 recyclerView 中的单选。

    现在让我们跳到解决方案, 只需按照以下教程,根据需要更改变量、字段和背景,您必须在RecyclerViewonBindViewHolder() 方法中实现以下方法

    首先,初始化lastClickedPosition和isclicked

        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
    
        }
    }
    

    让我知道这是否有效。

    【讨论】:

    • 实现了相同的代码来单击项目并突出显示
    • 我需要重新创建适配器并且没有选择任何项目然后总是选择回收适配器上的第一个项目
    • ImageClick(View v, int position1) 您的代码中有这一行,您正在实现 setOnItemClickListener,在此单击侦听器中,您使用 position1 并将其分配给 I,而不是将 position 分配给 @ 987654330@,而不是position1,因为当您进行比较时,您是在与position 进行比较,即if(I==position)
    • 你是对的,但我将使用 ImageClick(View v, int position1) 将 I 变量设置为点击项目的位置。接下来,我比较它在 bindholder 上的所有项目
    • @Override public void onClick(View v) { listener.ImageClick(v, getAdapterPosition()); } 这里的 getAdapterPosition() 总是会给你最后一个项目在列表中的位置,你的位置已经搞砸了
    【解决方案4】:

    在 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多