简体   繁体   English

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

[英]Change image view background of View Pager2 selected image in android

I am trying to changing the background imageview of viewpager2 selected imageview in android.我正在尝试更改android中viewpager2所选图像视图的背景图像视图。 But in my case not changing image view background, when viewpager2 selected.但是,在我的情况下,当ViewPager2选择时,就不会更改图像视图背景。 Below code to change image view background.下面的代码更改图像视图背景。

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

My Adapter 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);
        }

    }
}

Anyone can guide me how to change image view background, when viewpager2 selected.任何人都可以指导我如何在选择 viewpager2 时更改图像视图背景。

Expected like this期待这样

在此处输入图片说明

Thanks in Advance.提前致谢。

I think you are approaching this in the wrong way.我认为你以错误的方式接近这个。 What you need is a public method for your adapter which stores the position selected from your viewpager2's onPageSelected() and in onBindViewHolder() method of your adapter simply use a check for selecting the background to use.您需要的是适配器的公共方法,它存储从 viewpager2 的onPageSelected()和适配器的onBindViewHolder()方法中选择的位置,只需使用检查来选择要使用的背景。

I have made changes to your adapter as below:我对您的适配器进行了如下更改:

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

    }
}

And then instead of complicating your code your onPageSelected() should eb something like this然后不要让你的代码复杂化,你的onPageSelected()应该像这样

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

That's all, let us know if this answer helped solve your issue.就是这样,让我们​​知道这个答案是否有助于解决您的问题。

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

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