我有一個應用程序,其中有五個類別的抽屜。每個類別打開一個選項卡式viewpager(取決於所選類別)並顯示用戶可以滑過的問題。我遇到的問題是,如果選擇了答案 - 讓我們說類別1,問題0-類別2出現相同的答案,問題0 &類別3,問題0等等。無論我調用clearchecked()多少次,答案都會在類別上重複,但我還沒有回答。如果我在onResume()中放入clearchecked(),這會停止這種效果,但會在每次刷新片段時刪除所有答案。FragmentStatePagerAdapter不會破壞舊的視圖狀態
我已經確保實現notifydatasetchanged/return position_none(這幫助我解決了根據類別更改問題的部分)。據我的理解,通過使用FragmentStatePagerAdapter而不是FragmentPagerAdapter,視圖/碎片將被銷燬,因此重新創建時不會保留視圖狀態?
任何幫助將不勝感激這些緊張的眼睛。
FragmentStatePagerAdapter:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
SharedPreferences prefs;
int row;
int form;
Context mContext;
public void getContext(Context context) {
prefs = PreferenceManager.getDefaultSharedPreferences((context));
mContext = context;
}
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
//form = category #1-5
return QuestionFragment.newInstance(position, form, mContext);
}
@Override
public int getCount() {
row = prefs.getInt("Valid", 0);
return prefs.getInt("TotalQuestions_" + row, 3);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void getNumber(int n) {
form = n;
}
}
DrawerActivity:
public class Drawer extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
ViewPager mViewPager;
SectionsPagerAdapter mSectionsPagerAdapter;
Blog blog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
mViewPager = (ViewPager) findViewById(R.id.container);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Hello! Swipe between screens!", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mSectionsPagerAdapter.getContext(getApplicationContext());
FragmentManager fm = getSupportFragmentManager();
blog = new Blog();
fm.beginTransaction().replace(R.id.container1, blog).commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.drawer, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
FragmentManager fm = getSupportFragmentManager();
int id = item.getItemId();
if (id == R.id.leadership) {
mSectionsPagerAdapter.getNumber(0);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mSectionsPagerAdapter);
if(fm.findFragmentById(R.id.container1)!=null) {
fm.beginTransaction().remove(fm.findFragmentById(R.id.container1)).commit();
}
} else if (id == R.id.management) {
mSectionsPagerAdapter.getNumber(1);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mSectionsPagerAdapter);
if(fm.findFragmentById(R.id.container1)!=null) {
fm.beginTransaction().remove(fm.findFragmentById(R.id.container1)).commit();
}
} else if (id == R.id.wellbeing) {
mSectionsPagerAdapter.getNumber(2);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mSectionsPagerAdapter);
if(fm.findFragmentById(R.id.container1)!=null) {
fm.beginTransaction().remove(fm.findFragmentById(R.id.container1)).commit();
}
} else if (id == R.id.person_growth) {
mSectionsPagerAdapter.getNumber(3);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mSectionsPagerAdapter);
if(fm.findFragmentById(R.id.container1)!=null) {
fm.beginTransaction().remove(fm.findFragmentById(R.id.container1)).commit();
}
} else if (id == R.id.strategy) {
mSectionsPagerAdapter.getNumber(4);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(mSectionsPagerAdapter);
if(fm.findFragmentById(R.id.container1)!=null) {
fm.beginTransaction().remove(fm.findFragmentById(R.id.container1)).commit();
}
} else if (id == R.id.blogentry) {
fm.beginTransaction().replace(R.id.container1, new Blog()).commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
QuestionFragments:
public class QuestionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
private static final String FORM = "form";
public RadioGroup selected;
private boolean check1;
private boolean check2;
private boolean check3;
private boolean check4;
public int button;
String[] convertedQuestions;
public static Context mContext;
Bundle answers = new Bundle();
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static QuestionFragment newInstance(int sectionNumber, int form, Context context) {
QuestionFragment fragment = new QuestionFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
args.putInt(FORM, form);
fragment.setArguments(args);
mContext = context;
return fragment;
}
public QuestionFragment() {
super();
}
@Override
public void setRetainInstance(boolean retain) {
super.setRetainInstance(false);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
//GETS THE QUESTION NAMES
//convertedQuestions = Array of questions
Set<String> rawQuestions = prefs.getStringSet("Questions_" + getArguments().getInt(FORM) + "", null);
Converter(rawQuestions);
//GETS THE CORRESPONDING LAYOUT
//Types = set of question types
Set<String> types = prefs.getStringSet("Types_" + getArguments().getInt(FORM) + "", null);
GetQuestionLayout getDaLayouts = new GetQuestionLayout();
View rootView = inflater.inflate(getDaLayouts.sort(types, getArguments().getInt(ARG_SECTION_NUMBER)), container, false);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
String fullQ = convertedQuestions[getArguments().getInt(ARG_SECTION_NUMBER)];
textView.setText(fullQ.substring(4, fullQ.length()));
//IF LINEAR SCALE
if (getDaLayouts.sort(types, getArguments().getInt(ARG_SECTION_NUMBER)) == R.layout.linear_scale) {
selected = (RadioGroup) rootView.findViewById(R.id.answer);
selected.clearCheck();
}
//IF MULTIPLE CHOICE
} else if (getDaLayouts.sort(types, getArguments().getInt(ARG_SECTION_NUMBER)) == R.layout.multiple_choice) {
CheckBox a = (CheckBox) rootView.findViewById(R.id.c1);
a.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check1 = true;
} else {
check1 = false;
}
}
});
CheckBox b = (CheckBox) rootView.findViewById(R.id.c2);
b.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check2 = true;
} else {
check2 = false;
}
}
});
CheckBox c = (CheckBox) rootView.findViewById(R.id.c3);
c.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check3 = true;
} else {
check3 = false;
}
}
});
CheckBox d = (CheckBox) rootView.findViewById(R.id.c4);
d.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
check4 = true;
} else {
check4 = false;
}
}
});
return rootView;
}
public String[] Converter(Set<String> set) {
convertedQuestions = new String[set.size()];
TreeSet<String> sorted = new TreeSet<>();
for (String sort : set) {
sorted.add(sort);
}
sorted.toArray(convertedQuestions);
return convertedQuestions;
}
}