首页 > 解决方案 > 如何在片段中放置或替换列表

问题描述

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

有这个想法吗?

主要活动

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

我的片段,问题1

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

标签: javaandroidandroid-studio

解决方案


我建议使用Fragment's 参数来传递问题 ID。您已经对 a 进行了抽象Question——看来这里唯一真正改变的是问题 ID。

例如,您将只有一个QuestionFragment负责显示任何给定的Question

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

推荐阅读