I can’t correctly pass the item number to the fragment via ViewPager

Sample code taken from a book “Android Programming: The Big Nerd Ranch Guide” (3rd Edition) (Big Nerd Ranch Guides). Bill Phillips, Chris Stewart, Kristin Marsicano. Сhapter 11:
There is a ViewPager code:

public class CrimePagerActivity extends AppCompatActivity {

    private static final String EXTRA_CRIME_ID =
            "com.bignerdranch.android.criminalintent.crime_id";

    private static ViewPager mViewPager;
    public static List<Crime> mCrimes;
    public static int indexPager;

    private Button startButton;
    private Button finishButton;

    public static Intent newIntent(Context packageContext, UUID crimeId) {
        Intent intent = new Intent(packageContext, CrimePagerActivity.class);
        intent.putExtra(EXTRA_CRIME_ID, crimeId);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime_pager);

        UUID crimeId = (UUID) getIntent()
                .getSerializableExtra(EXTRA_CRIME_ID);

        mViewPager = (ViewPager) findViewById(R.id.crime_view_pager);
        mViewPager.setClipToPadding(false);
        mViewPager.setPadding(20, 0, 20, 0);
        mViewPager.setPageMargin(20);
        mCrimes = CrimeLab.get(this).getCrimes();
        FragmentManager fragmentManager = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {

            @Override
            public Fragment getItem(int position) {  // !!!
                Crime crime = mCrimes.get(position);
                indexPager = position;
                return CrimeFragment.newInstance(crime.getId());
            }

            @Override
            public int getCount() {
                return mCrimes.size(); //!!!!!!!!
            }
        });

        for (int i = 0; i < mCrimes.size(); i++) {
            if (mCrimes.get(i).getId().equals(crimeId)) {
                mViewPager.setCurrentItem(i);
                indexPager = i;
                break;
            }
        }
    }

    public static void razmeshcheniyePager(int a){
        mViewPager.setCurrentItem(a);
    }
}

And fragment code:

 public class CrimeFragment extends Fragment {

    private static final String ARG_CRIME_ID = "crime_id";

    private Crime mCrime;
    private EditText mTitleField;
    private Button mDateButton;
    private CheckBox mSolvedCheckBox;

    private Button startButton;
    private Button finishButton;

    private CrimePagerActivity mPagerActivity;

    public static CrimeFragment newInstance(UUID crimeId) {
        Bundle args = new Bundle();
        args.putSerializable(ARG_CRIME_ID, crimeId);
        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(args);
        return fragment;
    }

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
            mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_crime, container, false); // уточнить, что происходит здесь
        mTitleField = (EditText) v.findViewById(R.id.crime_title);


        startButton = (Button) v.findViewById(R.id.start_button); 
        if(CrimePagerActivity.indexPager == 2) startButton.setEnabled(false);
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPagerActivity.razmeshcheniyePager(0);
            }
        });

        finishButton = (Button) v.findViewById(R.id.fifsh_button); 
        if (CrimePagerActivity.indexPager == CrimePagerActivity.mCrimes.size()-3) finishButton.setEnabled(false);
        finishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPagerActivity.razmeshcheniyePager(CrimePagerActivity.mCrimes.size()-1);
            }
        });

        mTitleField.setText(mCrime.getTitle());
        mTitleField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mCrime.setTitle(s.toString()); // возвращает строку, которая используется для задания заголовка Crime
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        mDateButton = (Button) v.findViewById(R.id.crime_date); // кнопка во фрагменте создаётся немного не так, как в активности
        mDateButton.setText(mCrime.getDate().toString()); // вывод даты на кнопке
        mDateButton.setEnabled(false); // блокироание возможности нажатия кнопки

        mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
        mSolvedCheckBox.setChecked(mCrime.isSolved()); // метод setChecked меняет булеву значение булевой переменной на противоположное
        mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mCrime.setSolved(isChecked);
            }
        });
        return v;
    }
}

I need to block the button to move to the beginning or end of the list, in case the user is already at the beginning or end of the list. To do this, I am trying to pass the position of an element through a static variable. The problem is that the position of the element is not transmitted correctly (that is, when the number 0 should be transmitted, 2 is transmitted, when 99 should be transmitted, 97 is transmitted). And even if you take this into account in the code of the fragment, the button lock still does not work correctly (buttons may even be blocked on several elements located nearby). I tried to find the problem using debug, ran into yet another obscure feature. The code, before locking the buttons, can be called several times in turn (it may not be called at all). The code of some methods in the anonymous class new FragmentStatePagerAdapter (which is in the CrimePagerActivity activity) can be called a huge number of times. Please explain what is happening and what to do about it.