Java 如何在片段中放置或替换列表

Java 如何在片段中放置或替换列表,java,android,android-studio,Java,Android,Android Studio,我制作了一个测验应用程序,其中我使用片段和查看页面显示我的问题。问题取自SQLite,这里我感到困惑:如果我有10个问题,那么我必须使用10个片段。如何使用1Fragment保存所有问题 有什么办法吗 主要活动: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private int mFragmentIndex = 0; private ViewPager

我制作了一个测验应用程序,其中我使用
片段和
查看页面
显示我的问题。
问题取自SQLite,这里我感到困惑:如果我有10个问题,那么我必须使用10个片段。如何使用1
Fragment
保存所有问题

有什么办法吗

主要活动

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private int mFragmentIndex = 0;
    private ViewPager viewPager;
    private Button back, next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        viewPager = findViewById(R.id.view_pager);
        setupViewPager(viewPager);

        back = findViewById(R.id.buttonBack);
        next = findViewById(R.id.buttonNext);
        back.setOnClickListener(this);
        next.setOnClickListener(this);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new Question1(), "Question1");
        adapter.addFrag(new Question2(), "Question2");
        adapter.addFrag(new Question3(), "Question3");
        viewPager.setOffscreenPageLimit(adapter.getCount());
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onClick(View view) {
        if (view == back) {
            mfragmentIndex--;
            viewPager.setCurrentItem(mFragmentIndex);
        } else if(view == next) {
            mfragmentIndex++;
            viewPager.setCurrentItem(mFragmentIndex);
        }
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitle = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }
        public void addFrag(Fragment fragment,String title){
            mFragmentList.add(fragment);
            mFragmentTitle.add(title);
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return super.getPageTitle(position);
        }
    }
}
public class Question1 extends Fragment {
    private List<Question> questionsList;
    private Question currentQuestion;

    private TextView txtQuestion, tvNoOfQs;
    private RadioButton rbtnA, rbtnB, rbtnC, rbtnD;

    private int obtainedScore = 0;
    private int questionId = 0;

    private int answeredQsNo = 0;

    ArrayList<String> myAnsList;

    public Question1() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final DBAdapter dbAdapter = new DBAdapter(getContext());
        questionsList = dbAdapter.getAllQuestions();
        currentQuestion = questionsList.get(questionId);

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_question1, container, false);
        final RadioGroup grp = (RadioGroup)view.findViewById(R.id.radioGroup1);
        tvNoOfQs = (TextView)view.findViewById(R.id.tvNumberOfQuestions);
        txtQuestion = (TextView)view.findViewById(R.id.tvQuestion);
        rbtnA = (RadioButton)view.findViewById(R.id.radio0);
        rbtnB = (RadioButton)view.findViewById(R.id.radio1);
        rbtnC = (RadioButton)view.findViewById(R.id.radio2);
        rbtnD = (RadioButton)view.findViewById(R.id.radio3);
        setPertanyaan();

        myAnsList = new ArrayList<String>();
        return view;
    }

    private void setPertanyaan() {
        rbtnA.setChecked(false);
        rbtnB.setChecked(false);
        rbtnC.setChecked(false);
        rbtnD.setChecked(false);

        answeredQsNo = questionId+1;
        tvNoOfQs.setText(+answeredQsNo+"/"+questionsList.size());

        txtQuestion.setText(currentQuestion.getQUESTION());
        rbtnA.setText(currentQuestion.getOptionA());
        rbtnB.setText(currentQuestion.getOptionB());
        rbtnC.setText(currentQuestion.getOptionC());
        rbtnD.setText(currentQuestion.getOptionD());

        questionId++;
    }
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
private int mFragmentIndex=0;
私人视页机视页机;
私人按钮后退,下一步;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager=findViewById(R.id.view\u pager);
设置viewPager(viewPager);
后退=findViewById(R.id.按钮后退);
next=findViewById(R.id.buttonNext);
back.setOnClickListener(this);
next.setOnClickListener(this);
}
专用无效设置ViewPager(ViewPager ViewPager){
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager());
addFrag(新问题1(),“问题1”);
addFrag(新问题2(),“问题2”);
addFrag(新问题3(),“问题3”);
setOffscreenPageLimit(adapter.getCount());
viewPager.setAdapter(适配器);
}
@凌驾
公共void onClick(视图){
如果(视图==返回){
mfragmentIndex--;
viewPager.setCurrentItem(MFFragmentIndex);
}else if(视图==下一个){
MFFragmentIndex++;
viewPager.setCurrentItem(MFFragmentIndex);
}
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitle=new ArrayList();
公共ViewPagerAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFrag(片段、字符串标题){
添加(片段);
MFFragmentTitle.add(标题);
}
@可空
@凌驾
公共字符序列getPageTitle(int位置){
返回super.getPageTitle(位置);
}
}
}
我的片段,问题1

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private int mFragmentIndex = 0;
    private ViewPager viewPager;
    private Button back, next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        viewPager = findViewById(R.id.view_pager);
        setupViewPager(viewPager);

        back = findViewById(R.id.buttonBack);
        next = findViewById(R.id.buttonNext);
        back.setOnClickListener(this);
        next.setOnClickListener(this);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new Question1(), "Question1");
        adapter.addFrag(new Question2(), "Question2");
        adapter.addFrag(new Question3(), "Question3");
        viewPager.setOffscreenPageLimit(adapter.getCount());
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onClick(View view) {
        if (view == back) {
            mfragmentIndex--;
            viewPager.setCurrentItem(mFragmentIndex);
        } else if(view == next) {
            mfragmentIndex++;
            viewPager.setCurrentItem(mFragmentIndex);
        }
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitle = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }
        public void addFrag(Fragment fragment,String title){
            mFragmentList.add(fragment);
            mFragmentTitle.add(title);
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return super.getPageTitle(position);
        }
    }
}
public class Question1 extends Fragment {
    private List<Question> questionsList;
    private Question currentQuestion;

    private TextView txtQuestion, tvNoOfQs;
    private RadioButton rbtnA, rbtnB, rbtnC, rbtnD;

    private int obtainedScore = 0;
    private int questionId = 0;

    private int answeredQsNo = 0;

    ArrayList<String> myAnsList;

    public Question1() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final DBAdapter dbAdapter = new DBAdapter(getContext());
        questionsList = dbAdapter.getAllQuestions();
        currentQuestion = questionsList.get(questionId);

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_question1, container, false);
        final RadioGroup grp = (RadioGroup)view.findViewById(R.id.radioGroup1);
        tvNoOfQs = (TextView)view.findViewById(R.id.tvNumberOfQuestions);
        txtQuestion = (TextView)view.findViewById(R.id.tvQuestion);
        rbtnA = (RadioButton)view.findViewById(R.id.radio0);
        rbtnB = (RadioButton)view.findViewById(R.id.radio1);
        rbtnC = (RadioButton)view.findViewById(R.id.radio2);
        rbtnD = (RadioButton)view.findViewById(R.id.radio3);
        setPertanyaan();

        myAnsList = new ArrayList<String>();
        return view;
    }

    private void setPertanyaan() {
        rbtnA.setChecked(false);
        rbtnB.setChecked(false);
        rbtnC.setChecked(false);
        rbtnD.setChecked(false);

        answeredQsNo = questionId+1;
        tvNoOfQs.setText(+answeredQsNo+"/"+questionsList.size());

        txtQuestion.setText(currentQuestion.getQUESTION());
        rbtnA.setText(currentQuestion.getOptionA());
        rbtnB.setText(currentQuestion.getOptionB());
        rbtnC.setText(currentQuestion.getOptionC());
        rbtnD.setText(currentQuestion.getOptionD());

        questionId++;
    }
}
公共类问题1扩展片段{
私人列表问题列表;
私人问题;
私有文本视图txtQuestion,tvNoOfQs;
专用单选按钮rbtnA、rbtnB、rbtnC、rbtnD;
获得的私人int分数=0;
私人内部问题ID=0;
私有int应答qsno=0;
ArrayList myAnsList;
公共问题1(){
//必需的空公共构造函数
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
final DBAdapter DBAdapter=新DBAdapter(getContext());
questionsList=dbAdapter.getAllQuestions();
currentQuestion=questionsList.get(问题ID);
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment_问题1,容器,错误);
最终射线组grp=(射线组)视图.findViewById(R.id.RadioGroup 1);
tvNoOfQs=(TextView)view.findViewById(R.id.tvNumberOfQuestions);
txtQuestion=(TextView)view.findViewById(R.id.tvQuestion);
rbtnA=(RadioButton)view.findViewById(R.id.radio0);
rbtnB=(RadioButton)view.findViewById(R.id.radio1);
rbtnC=(RadioButton)view.findViewById(R.id.radio2);
rbtnD=(RadioButton)view.findViewById(R.id.radio3);
setpertanyan();
myAnsList=newArrayList();
返回视图;
}
私有void setpertanyan(){
rbtnA.setChecked(假);
rbtnB.setChecked(假);
rbtnC.setChecked(假);
rbtnD.setChecked(假);
answeredQsNo=问题ID+1;
tvNoOfQs.setText(+answeredQsNo+“/”+questionsList.size());
setText(currentQuestion.getQUESTION());
rbtnA.setText(currentQuestion.getOptionA());
rbtnB.setText(currentQuestion.getOptionB());
rbtnC.setText(currentQuestion.getOptionC());
rbtnD.setText(currentQuestion.getOptionD());
问题ID++;
}
}

我建议使用
片段
的参数来传递问题ID。您已经对
问题
有了一个抽象——似乎这里唯一真正改变的是问题ID

例如,您可能只有一个
问题片段
,负责显示任何给定的
问题

public class QuestionFragment extends Fragment {
    private static final String ARG_QUESTION_ID = "question_id";

    public static QuestionFragment newInstance(String questionId) {
        final QuestionFragment fragment = new QuestionFragment();
        final Bundle args = new Bundle();
        args.putString(ARG_QUESTION_ID, questionId);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        final String questionId = getArguments().getString(questionId);
        final DBAdapter dbAdapter = new DBAdapter(getContext());
        questionsList = dbAdapter.getAllQuestions();
        currentQuestion = questionsList.get(questionId);

        // ...

        return view;
    }
}
然后,在设置
ViewPager
时,只需在创建每个实例时为其提供问题ID即可:

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(QuestionFragment.newInstance(0), "Question1"));
    adapter.addFrag(QuestionFragment.newInstance(1), "Question2"));
    adapter.addFrag(QuestionFragment.newInstance(2), "Question3"));
    viewPager.setOffscreenPageLimit(adapter.getCount());
    viewPager.setAdapter(adapter);
}

ty表示答案,我尝试了,但在问题列表中无法应用字符串,currentQuestion=questionsList.get(toString(questionid)),但不起作用。ty我得到了我的坏消息哈哈哈