Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将ListView选定项保存在具有ViewPager的片段中_Android_Android Listview_Android Fragments_Android Viewpager - Fatal编程技术网

Android 将ListView选定项保存在具有ViewPager的片段中

Android 将ListView选定项保存在具有ViewPager的片段中,android,android-listview,android-fragments,android-viewpager,Android,Android Listview,Android Fragments,Android Viewpager,我正在尝试制作一种测试应用程序,在其中你可以从一个问题切换到另一个问题,向左或向右滑动。所以,我有一个FragmentActivity,一个ViewPager和一个FragmentPagerAdapter FragmentPagerAdapter的每个新页面都使用相同的布局实例化一个新片段,该布局上有一个ListView,总共有5个页面。然后,一个ArrayAdapter用4个CheckedTextView填充ListView,当用户选择一个时,背景会发生变化 问题在于,当您从一个问题滑动到另一

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

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

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

我是碎片新手,但当我使用直接从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);
    }
    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);

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


}
FragmentPagerAdapter:

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

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


}
片段类:

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

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


}
公共静态类ArrayListFragment扩展了片段{
//当前页码。
国际货币基金组织;
公共静态最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
列表视图列表;
/**
*创建ArrayListFragment的新实例,提供“num”作为
*争论。
*/
静态ArrayListFragment newInstance(int num){
ArrayListFragment f=新的ArrayListFragment();
//提供num输入作为参数。
Bundle args=新Bundle();
args.putInt(“num”,num);
f、 设置参数(args);
返回f;
}
/**
*创建时,从实例的参数中检索该实例的编号。
*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mNum=getArguments()!=null?getArguments().getInt(“num”):1;
}
/**
*片段的UI是一个文本视图,显示一个问题,ListView带有
*四个可能的答案。
*/
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.fragment\u pager\u列表,容器,
假);
查看电视=v.findviewbyd(R.id.text);
//提出问题
(TextView)tv.setText(问题),;
//获取que ListView并填充它。
列表=(ListView)v.findViewById(R.id.listView1);
list.setAdapter(新的ArrayAdapter(getActivity()),
R.layout.list_项,myStringArray);
//选择一个项目。
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
//TODO自动生成的方法存根
arg1.setSelected(true);
}
});
返回v;
}
}

实际上,它不应该记住您的选择。一旦你离开页面,它可能会被销毁。默认情况下,ViewPager仅保存3个页面(当前页面、左侧和右侧)。但您可以在主机活动中保存用户选择。为此,您需要创建一个接口,比如说,函数
public void onAnswerSelected(int questionId,int answerId)
,并在
活动中实现它。在片段覆盖
onAttach
函数中,开关将活动作为参数。将其另存为类成员,您就可以回调活动。一旦用户选择应答呼叫
callback.onAnswerSelected(questionId,answerId)
。要恢复以前的状态,请在接口中添加另一个函数
getSavedAnswer(int questionId)
onActivityCreated()
中调用它。现在,您只需要在
活动
中保存答案的一些
哈希映射

为什么要恢复带有复选框的布局是合理的。若有android:id属性,片段可以恢复布局中的视图状态。但listView不会恢复状态,因为它取决于适配器的实现。您必须手动执行此操作,例如:将listView中的选择状态保存在onSaveInstanceState of Fragment中,然后从savedInstanceState获取您的选择,就像在“活动”中一样。

谢谢您的回答。它保存了3页,但它甚至不记得已经保存的3页中的选项。当我滑动到第二个页面时,第一个页面没有被破坏,尽管它不记得它的选择。实际上在你的新实例中,你总是创建ArrayListFragment的新实例,所以,你总是得到新片段。ViewPager在任何情况下都将调用getItem。当您将为特定num缓存所有创建的片段时,请在ViewPager适配器中保存片段列表。但当重新创建ViewPager时,您需要考虑配置更改情况。同样,在活动中保存数据的示例会更好,因为您可以重写onSaveInstance函数并保存所有答案