У меня есть пейджер, где на каждой странице есть карточка с изображением, текстом и кнопкой. Мне нужно, чтобы текст кнопки на каждой странице менялся после нажатия. Итак, внутри ViewPagerAdapter mapSize.setText() работает только снаружи setOnClickListener(), а внутри onClick не работает. Это мой класс ViewPagerAdapter
public class ViewPagerAdapter extends PagerAdapter {
private List<Model> models;
private LayoutInflater layoutInflater;
private Context context;
private Button mapSize;
private Integer size;
private static final String TAG = "ViewPagerAdapter";
public ViewPagerAdapter(Context context, List<Model> models, String playerName) {
this.models = models;
this.layoutInflater = layoutInflater;
this.context = context;
}
@Override
public int getCount() {
return models.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view.equals(o);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
layoutInflater = LayoutInflater.from(context);
View view = null;
ImageView imageView;
TextView title, desc;
imageView = view.findViewById(R.id.gameModeImage);
title = view.findViewById(R.id.title);
desc = view.findViewById(R.id.description);
imageView.setImageResource(models.get(position).getImage());
title.setText(models.get(position).getTitle());
desc.setText(models.get(position).getDescription());
mapSize = view.findViewById(R.id.mapSizeBtn);
mapSize.setText("hello2"); //here works
mapSize.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mapSize.setText("hello"); //here does not work
}
});
container.addView(view, 0);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "This page was clicked: " + position);
if (position != 1)
Toast.makeText(context, "Coming Soon.", Toast.LENGTH_SHORT).show();
else {
Intent newGameActivity = new Intent(context, com.game.project.GameActivity.class);
newGameActivity.putExtra("size", size);
context.startActivity(newGameActivity);
}
}
});
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View)object);
}
}
Вы переназначаете свою кнопку для каждого элемента, который создается новым элементом в вашем адаптере. Вы должны ссылаться на свою кнопку следующим образом:
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
layoutInflater = LayoutInflater.from(context);
View view = null;
ImageView imageView;
TextView title, desc;
imageView = view.findViewById(R.id.gameModeImage);
title = view.findViewById(R.id.title);
desc = view.findViewById(R.id.description);
imageView.setImageResource(models.get(position).getImage());
title.setText(models.get(position).getTitle());
desc.setText(models.get(position).getDescription());
final Button mapSize = view.findViewById(R.id.mapSizeBtn);
mapSize.setText("hello2"); //here works
mapSize.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mapSize.setText("hello"); //here does not work
}
});
container.addView(view, 0);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "This page was clicked: " + position);
if (position != 1)
Toast.makeText(context, "Coming Soon.", Toast.LENGTH_SHORT).show();
else {
Intent newGameActivity = new Intent(context, com.game.project.GameActivity.class);
newGameActivity.putExtra("size", size);
context.startActivity(newGameActivity);
}
}
});
return view;
}
Все элементы в экземпляре элемента должны быть объявлены окончательными для правильной работы.