gpt4 book ai didi

android - 将 ListView 选定的项目保存在具有 ViewPager 的 fragment 中

转载 作者:太空狗 更新时间:2023-10-29 15:06:57 26 4
gpt4 key购买 nike

我正在尝试制作某种测试应用程序,您可以在其中从一个问题切换到另一个问题,向左或向右滑动。所以,我有一个 FragmentActivity、一个 ViewPager 和一个 FragmentPagerAdapter。

FragmentPagerAdapter 的每个新页面都使用相同的布局实例化一个新的 fragment ,该布局上有一个 ListView,总共最多 5 个页面。然后一个 ArrayAdapter 用 4 个 CheckedTextView 填充 ListView,当用户选择一个时,背景发生变化。

问题是,当您从一个问题滑到另一个问题时,所选项目会丢失,而当用户滑回上一个问题时,该项目将不再被选中。

我是 fragment 的新手,但是当我使用直接从 xml 扩展的复选框执行相同操作时,它们的选定状态在滑动时不会丢失。

这是一些代码:

FragmentActivity onCreate():

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//Getting the array of questions.
res = getResources();
questions = res.getStringArray(R.array.questions_1);

// Create the adapter that will return a fragment for each of the five
// questions of the app.
mAdapter = new MyAdapter(getSupportFragmentManager());

// Set up the ViewPager with the FragmentPagerAdapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(10);
mViewPager.setAdapter(mAdapter);
}

FragmentPagerAdapter:

    public class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);

}

@Override
public int getCount() {
//Number of pages
return 5;
}

@Override
public Fragment getItem(int position) {
ArrayListFragment fragment = ArrayListFragment
.newInstance(position);

return fragment;
}

@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();

return getString(R.string.title_section) + " " + (position + 1);

}
}

fragment 类:

public static class ArrayListFragment extends Fragment {
//Current Page number.
int mNum;
public static final String ARG_SECTION_NUMBER = "section_number";
ListView list;

/**
* Create a new instance of ArrayListFragment, providing "num" as an
* argument.
*/
static ArrayListFragment newInstance(int num) {
ArrayListFragment f = new ArrayListFragment();

// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);

return f;
}

/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;

}

/**
* The Fragment's UI is a textview showing a question and the ListView with
* the four possible answers.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_pager_list, container,
false);
View tv = v.findViewById(R.id.text);
//Set the Question
((TextView) tv).setText(questions[mNum]);
//Get que ListView and fill it.
list = (ListView) v.findViewById(R.id.listView1);
list.setAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.list_item, myStringArray));
//Select an item.
list.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
arg1.setSelected(true);
}

});


return v;
}


}

最佳答案

其实它不应该记住你的选择。一旦您离开页面,它可能会被销毁。默认情况下,ViewPager 仅保存 3 个页面(当前页面,左侧和右侧)。但是您可以在主机 Activity 中保存用户选择。为此,您需要创建一个接口(interface),比方说,函数 public void onAnswerSelected(int questionId, int answerId) 并在 Activity 中实现它。在 fragment 重写 onAttach 函数中,女巫将 Activity 作为参数。将其保存为类(class)成员,您可以回调 Activity 。一旦用户选择应答调用 callback.onAnswerSelected(questionId, answerId)。要恢复以前的状态,请在您的界面中添加另一个函数 getSavedAnswer(int questionId)onActivityCreated() 中调用它。现在您需要在 Activity 中保存答案的一些 HashMap 答案。

关于android - 将 ListView 选定的项目保存在具有 ViewPager 的 fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090632/

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