android-在viewpager中保存视图状态
作者:互联网
这是问题ViewPager and fragments — what’s the right way to store fragment’s state?的跟进.我需要有人在代码中解释这部分答案.
另一种方法是重写FragmentPageAdapter.instantiateItem(View,int)并保存对从超级调用返回的片段的引用,然后再返回它(它具有查找该片段(如果已经存在)的逻辑).
我正在使用PagerAdapter将光标中的数据加载到viewpager中.我已经重写了PagerAdapter.intantiateItem.我需要做的就是能够保存被单击的Button的状态.这是我的代码
public class CustomQuestionPagerAdapter extends PagerAdapter {
private Cursor cursor;
private Cursor cursorCategory;
private LayoutInflater inflater;
private Context context;
private ArrayList<String> optionsArray;
String rightAnswer;
String wrongAnswer1;
String wrongAnswer2;
Button option1;
Button option2;
Button option3;
public CustomQuestionPagerAdapter(Context context, Cursor cursor1, Cursor cursor2) {
this.context = context;
this.cursor = cursor1;
this.cursorCategory = cursor2;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void swapCursor(Cursor cursor) {
this.cursor = cursor;
}
public void swapAnotherCursor(Cursor cursor) {
this.cursorCategory = cursor;
}
public void destroyItem(View view, int position, Object object) {
((ViewPager) view).removeView((ScrollView) object);
}
@Override
public int getCount() {
if (cursor == null) {
return 0;
}else {
return cursor.getCount();
}
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#instantiateItem(android.view.View, int)
*/
@Override
public Object instantiateItem(View view, int position) {
cursor.moveToPosition(position);
final ViewPager pager = (ViewPager) view.findViewById(R.id.pager_nav);
ScrollView layout = (ScrollView) inflater.inflate(R.layout.question_activity, null);
if (cursorCategory != null && cursorCategory.moveToFirst()){
String s = cursorCategory.getString(cursorCategory.getColumnIndex("name"));
((TextView)layout.findViewById(R.id.text_category)).setText(s);
}
Typeface tpf = Typeface.createFromAsset(context.getAssets(), "Roboto-Light.ttf");
String text = cursor.getString(cursor.getColumnIndex("question_text"));
TextView question_text = (TextView)layout.findViewById(R.id.text_question);
question_text.setText(text);
question_text.setTypeface(tpf);
String qPos = Integer.toString(position + 1) + ".";
TextView question_position = (TextView) layout.findViewById(R.id.text_position);
question_position.setText(qPos);
question_position.setTypeface(tpf);
this.rightAnswer = cursor.getString(cursor.getColumnIndex(DBHelper.RIGHT_ANSWER));
this.wrongAnswer1 = cursor.getString(cursor.getColumnIndex(DBHelper.WRONG_ANSWER1));
this.wrongAnswer2 = cursor.getString(cursor.getColumnIndex(DBHelper.WRONG_ANSWER2));
optionsArray = new ArrayList<String>();
optionsArray.clear();
optionsArray.add(this.rightAnswer);
optionsArray.add(this.wrongAnswer1);
optionsArray.add(this.wrongAnswer2);
Collections.shuffle(optionsArray);
option1 = (Button) layout.findViewById(R.id.button_option1);
option1.setText((CharSequence) this.optionsArray.get(0));
option2 = (Button) layout.findViewById(R.id.button_option2);
option2.setText((CharSequence) this.optionsArray.get(1));
option3 = (Button) layout.findViewById(R.id.button_option3);
option3.setText((CharSequence) this.optionsArray.get(2));
final Button next = (Button) layout.findViewById(R.id.next_button);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
int j = getItem(+1) + 1;
Toast.makeText(context, context.getResources().getString(R.string.question_no) + " " + j, Toast.LENGTH_SHORT).show();
pager.setCurrentItem(getItem(+1), true);
next.setBackgroundColor(0xffeeeeee); // i need to save this new bacground color
}
private int getItem(int i) {
return i += pager.getCurrentItem();
}
});
我也尝试过这个答案,但是没有用Saving Fragment state in ViewPager
提前致谢.
解决方法:
动态保存在shared pref中单击的button_id.您已完成所有操作,需要从共享首选项恢复按钮状态,并且在单击任何按钮时,请在共享首选项中添加按钮.
更新:
public static final String PREFS_NAME = "MyPrefsFile";
------
final Button next = (Button) layout.findViewById(R.id.next_button);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean isClicked = settings.getBoolean(getCurrentItemPosition(), false);
if(isClicked)
{
next.setBackgroundColor(0xffeeeeee);
}
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
int j = getItem(+1) + 1;
Toast.makeText(context, context.getResources().getString(R.string.question_no) + " " + j, Toast.LENGTH_SHORT).show();
pager.setCurrentItem(getItem(+1), true);
// i need to save this new bacground color
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(getCurrentItemPosition(), true);
editor.commit();
}
private int getItem(int i) {
return i += pager.getCurrentItem();
}
});
getCurrentItemPosition()是当前的项目位置.
标签:android-pageradapter,android-viewpager,android 来源: https://codeday.me/bug/20191122/2059770.html