Android 具有一个片段的多布局viewpager

Android 具有一个片段的多布局viewpager,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我必须明确,我正在寻找一个示例或答案,在该示例或答案中,我可以在viewpager中使用各种不同的布局设计,并且所有页面中的数据都是动态的,并且所有页面都可以由用户交互。 我的用例和当前解决问题的方法: 因此,我有8种不同类型的问题类型,因此我为所有这些问题创建了layouts。此外,这些布局视图中的数据必须通过从sqlite数据库获取数据的javaMap填充 但一个测试可能包含上述8个问题中的25个不同布局的问题。对于所有这25个问题,我想使用一个Viewpager和一个Fragment,它将

我必须明确,我正在寻找一个示例或答案,在该示例或答案中,我可以在viewpager中使用各种不同的布局设计,并且所有页面中的数据都是动态的,并且所有页面都可以由用户交互。

我的用例和当前解决问题的方法:

因此,我有8种不同类型的问题类型,因此我为所有这些问题创建了
layouts
。此外,这些布局视图中的数据必须通过从sqlite数据库获取数据的java
Map
填充

但一个测试可能包含上述8个问题中的25个不同布局的问题。对于所有这25个问题,我想使用一个
Viewpager
和一个
Fragment
,它将根据从java映射中传递的问题类型值返回所需的布局

我对此的看法:

我创建了一个活动,并使用viewpager布局对其进行了扩展:

R.layout.练习寻呼机


*活动编辑代码*

TestFragment编辑代码

公共类TestFragment扩展了片段{

AnswerEnterListener callBack;
FragmentData fD;
Button submitAnswer;
EditText userAnswer;

TextView qText,expl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
          return inflater.inflate(R.layout.qtype1, container, false);
}

public interface AnswerEnterListener
{
    public void onInputAnswer(String ans);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        callBack=(AnswerEnterListener) activity;
        fD=(FragmentData) activity;
    } catch (Exception e) {
        // TODO: handle exception
    }
}

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


    qText=(TextView) getActivity().findViewById(R.id.question_text);
    expl=(TextView)getActivity().findViewById(R.id.explanation_text);


    qText.setText(Html.fromHtml(fD.getData().getQUES()));
    expl.setText(Html.fromHtml(fD.getData().getEXPL()));

}       
}

与TestFragment类似,我也没有其他片段。每种都对应一种布局类型。

问题:

  • 第一个布局在第一次重复两次,而且当我向后滑动时,数据的位置被放错了位置
  • 这是正确的方法吗?有人建议我应该使用三个片段,并用数据更新左右片段,但这确实让我感到震惊。任何人都可以分享一个好的例子或博客
我必须清楚,我正在寻找一个例子或答案,我可以 在viewpager中使用各种不同的布局设计,并在所有 页面将是动态的,所有页面都可以通过 用户

这应该是很容易做到的,但你似乎已经复杂了很多。您需要这样做:

使用LoadingTestView()从数据库获取数据;功能

初始化
ViewPager
并设置其适配器。适配器将在
getItem()
方法中返回正确的片段实例,具体取决于您的条件

在片段中,从应该通过某种方法公开数据的活动中检索数据


我举了一个简单的例子,你可以找到。

你基本上想要实现一个测验应用程序,其中最多可以有8种类型的问题(8种不同的问题布局),对吗?所有页面中的数据都是动态的-动态程度如何?您是否计划在创建片段后对其进行更改?所有页面都可以由用户交互。-互动是什么意思?是的,你是对的,我想实施一个测验。动态数据意味着数据将来自sqlite数据库或映射,但不是硬编码的。是的,一旦片段被创建,我想用我的集合中的数据填充它。有些页面和按钮上都有编辑文本,比如提交答案,这样就可以进行交互。@Luksprog您是否打算提出一些建议,因为我想编辑上面的代码,使之符合我现在正在做的事情。更新问题。你的代码太复杂了,无法完成你想做的事情。@Luksprog看一下我的编辑,实际上现在我已经为每个布局创建了片段,并创建了一个片段列表,在需要时返回所需的布局。对于我的用例来说,这是正确的方法吗?这种方法的问题是,我无法在我的viewpagerGot中更新页面滑动上的数据。事实上,我在
onActivityCreated
中初始化视图时犯了错误,尽管
onCreateView
,但您的这种方法确实有所帮助。感谢您的时间和宝贵的意见
   public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter{

         private List<Fragment> fragments;

        public MyFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        /** This method will be invoked when a page is requested to create */
        @Override
        public Fragment getItem(int position) {
            System.out.println("value of position "+position);
            return this.fragments.get(position);
        }


        /** Returns the number of pages */
        @Override
        public int getCount() {
            return this.fragments.size();
        }

        @Override
        public int getItemPosition(Object object) {
            // TODO Auto-generated method stub
            return MyFragmentPagerAdapter.POSITION_NONE;
        }
    }
public interface FragmentData {
    public void setData(GrePracticeTestRecord p);
    public GrePracticeTestRecord getData();
}
AnswerEnterListener callBack;
FragmentData fD;
Button submitAnswer;
EditText userAnswer;

TextView qText,expl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
          return inflater.inflate(R.layout.qtype1, container, false);
}

public interface AnswerEnterListener
{
    public void onInputAnswer(String ans);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        callBack=(AnswerEnterListener) activity;
        fD=(FragmentData) activity;
    } catch (Exception e) {
        // TODO: handle exception
    }
}

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


    qText=(TextView) getActivity().findViewById(R.id.question_text);
    expl=(TextView)getActivity().findViewById(R.id.explanation_text);


    qText.setText(Html.fromHtml(fD.getData().getQUES()));
    expl.setText(Html.fromHtml(fD.getData().getEXPL()));

}