Изменить фон просмотра изображения выбранного изображения View Pager2 на android - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь изменить фоновое изображение viewpager2 выбранного изображения в android. Но в моем случае не меняется фон просмотра изображения, когда viewpager2 выбран. Ниже приведен код для изменения фона представления изображения.

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

Мой класс адаптера

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.

Ожидается, как это

enter image description here

Заранее спасибо.

1 Ответ

1 голос
/ 27 февраля 2020

Я думаю, что вы подходите к этому неправильно. Вам нужен метод publi c для вашего адаптера, в котором сохраняется позиция, выбранная из onPageSelected() вашего viewpager2 и в методе 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);
        }

Вот и все, дайте нам знать если этот ответ помог решить вашу проблему.

...