在 android 中更改 View Pager2 所选图像的图像视图背景

Change image view background of View Pager2 selected image in android

我正在尝试更改 android 中 viewpager2 选择的图像视图的背景图像视图。 But in my case not changing image view background, when viewpager2 selected.下面的代码更改图像视图背景。

 final List<Integer> names = new ArrayList<Integer>();
                   for(int i=0;i<5;i++){
                       names.add(i);
                   }
                   insideRoomAdapter = new InsideRoomAdapter(context,names);
                   viewPager.setAdapter(insideRoomAdapter);
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                        @Override
                        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                        }

                        @Override
                        public void onPageSelected(int position) {
                            super.onPageSelected(position);                  
                          for(int i=0;i<names.size();i++){
                              if(names.get(position) == position){
                                  Toast.makeText(context,"pos:"+ names.get(position),Toast.LENGTH_SHORT).show();
                                  insideRoomAdapter.imageView.setBackground(ContextCompat.getDrawable(context,R.drawable.selected_light_bg));
                                  viewPager.getAdapter().notifyDataSetChanged();
                              }else {
                                  insideRoomAdapter.imageView.setBackground(ContextCompat.getDrawable(context,R.drawable.inside_room_item_bg));
                                  viewPager.getAdapter().notifyDataSetChanged();

                              }
                          }

                        }

                        @Override
                        public void onPageScrollStateChanged(int state) {
                            super.onPageScrollStateChanged(state);
                        }
                    });

我的适配器class

public class InsideRoomAdapter extends RecyclerView.Adapter<InsideRoomAdapter.ViewHolder> {
    Context context;
    List<Integer> list;
    ImageView imageView;

    public InsideRoomAdapter(Context context,List<Integer> list) {
        this.context = context;
        this.list = list;
    }


    @NonNull
    @Override
    public InsideRoomAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.inside_room_items,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull InsideRoomAdapter.ViewHolder holder, int position) {
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"light clicked",Toast.LENGTH_LONG).show();
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.inside_light_img);
        }

    }
}

任何人都可以指导我如何在选择 viewpager2 时更改图像视图背景。

期待这样

提前致谢。

我认为您的处理方式有误。您需要的是用于适配器的 public 方法,它存储从 viewpager2 的 onPageSelected() 中选择的位置,并且在适配器的 onBindViewHolder() 方法中,只需使用检查来选择要使用的背景。

我已对您的适配器进行如下更改:

public class InsideRoomAdapter extends RecyclerView.Adapter<InsideRoomAdapter.ViewHolder> {
    private Context context;
    private List<Integer> list;
    //moved ImageView to ViewHolder class as private
    private int selectedPosition; //the int value for keeping track of your selected position

    public InsideRoomAdapter(Context context,List<Integer> list) {
        this.context = context;
        this.list = list;
        this.selectedPosition = 0; //initialize it here
    }


    @NonNull
    @Override
    public InsideRoomAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.inside_room_items,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull InsideRoomAdapter.ViewHolder holder, int position) {
        /* Since ImageView was moved reference it from the holder like below
         * Use a simple check to verify it the adapter position matches with the selectedPosition
         * if so simply set the backgrounds as required
         */
        if(position == selectedPosition) {
            holder.imageView.setBackground(ContextCompat.getDrawable(context,R.drawable.selected_light_bg));
        } else {
            holder.imageView.setBackground(ContextCompat.getDrawable(context,R.drawable.inside_room_item_bg));
        }
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"light clicked",Toast.LENGTH_LONG).show();
            }
        });

    }

    public void setSelectedPosition(int newPosition) {
        this.selectedPosition = newPosition;
        notifyDataSetChanged();
        /* If you require better animations make use of notifyItemChanged() instead
         * save selectedPosition value in a temp variable before swap
         * and call notifyItemChanged() for both positions old and new
         */
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.inside_light_img);
        }

    }
}

然后,不要使您的代码复杂化,您的 onPageSelected() 应该像这样

@Override
public void onPageSelected(int position) {
        super.onPageSelected(position);
        insideRoomAdapter.setSelectedPosition(position);
        }

就这些了,如果这个答案有助于解决您的问题,请告诉我们。