gpt4 book ai didi

java - 我无法通过 ViewPager 正确地将项目编号传递给 fragment

转载 作者:行者123 更新时间:2023-12-01 17:39:10 26 4
gpt4 key购买 nike

ViewPager代码:

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

和 fragment 代码:

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

我需要阻止按钮移动到列表的开头或结尾,以防用户已经位于列表的开头或结尾。为此,我尝试通过静态变量传递元素的位置。问题是元素的位置没有正确传输(即当应该传输数字0时,传输2,当应该传输99时,传输97)。即使您在 fragment 的代码中考虑到这一点,按钮锁仍然无法正常工作(按钮甚至可能被位于附近的几个元素阻止)。我尝试使用调试来查找问题,但遇到了另一个晦涩的功能。该代码在锁定按钮之前可以依次调用多次(也可能根本不调用)。匿名类new FragmentStatePagerAdapter(位于CrimePagerActivity Activity 中)中的一些方法的代码可以被调用大量次。请解释发生了什么以及如何处理。

附注示例代码取自《Android 编程:大 Nerd 牧场指南》(第 3 版)一书(Big Nerd Ranch Guides)。比尔·菲利普斯、克里斯·斯图尔特、克里斯汀·马西卡诺。第11章

最佳答案

您正在 getItem() 中设置 indexPager。这是不正确的。 getItem() 可以出于任何原因随时调用,并且不一定反射(reflect)当前查看或选择的项目。您需要找到另一种方法来设置当前“选定”的项目。

请参阅documentation for FragmentStatePagerAdapter 。该文档中有一个很好的示例说明了如何执行此操作。

关于java - 我无法通过 ViewPager 正确地将项目编号传递给 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60991578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com