在 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);
}
就这些了,如果这个答案有助于解决您的问题,请告诉我们。
我正在尝试更改 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);
}
就这些了,如果这个答案有助于解决您的问题,请告诉我们。