【问题标题】:multiple layout viewpager with one fragment带有一个片段的多个布局查看器
【发布时间】:2013-08-07 07:47:43
【问题描述】:

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

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

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

但测试可能包含上述 8 个问题中的 25 个不同布局的问题。对于所有这 25 个问题,我想使用 ViewpagerFragment,它们将根据通过 问题类型值来自我的 java 地图。

我对此的看法:

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

R.layout.practice_pager

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_container" android:layout_width="match_parent" android:layout_height="match_parent" />

*活动编辑代码*

       public class TestActivity extends FragmentData implements FragmentData{

            FragmentManager manager=getSupportFragmentManager();
            private ViewPager mViewPager;  
            private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
            int PAGE_COUNT = 0;
            GrePracticeTestRecord p=new GrePracticeTestRecord();
            private HashMap<Integer, GrePracticeResultRecord> mPracResultMap;

            public static int fragmentToReturn=0;


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

                mViewPager = (ViewPager) findViewById(R.id.test_container);  

           //This function is called to fetch the data from sqlite db and fill the map with data
                LoadingTestView();

                PAGE_COUNT=mPracRecordMap.size();
                    initPager();
              }

        //here I initialize the pager and set the adapter to it
        public void initPager()
    {
     p.setQUES(mPracRecordMap.get(1).getQUES());
     p.setEXPL(mPracRecordMap.get(1).getEXPL());    

     fragmentToReturn=Integer.parseInt(mPracRecordMap.get(1).getQTYPE());
     setData(p);

     mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fList);  
     mViewPager.setAdapter(mMyFragmentPagerAdapter);  

     mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {

            mMyFragmentPagerAdapter.notifyDataSetChanged();

            p.setQUES(mPracRecordMap.get(mViewPager.getCurrentItem()+1).getQUES());
            p.setEXPL(mPracRecordMap.get(mViewPager.getCurrentItem()+1).getEXPL());

            setData(p);

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
  }

           @Override
        public void setData(GrePracticeTestRecord p) {
            // TODO Auto-generated method stub

        }

        @Override
        public GrePracticeTestRecord getData() {
            // TODO Auto-generated method stub
            return p;
        }
    }

我的适配器编辑代码

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

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 ,我也没有其他片段。每个布局类型。

问题:

  • 第一次布局第一次重复两次,当我向后滑动时,数据的位置放错了。
  • 这是正确的方法吗,有人建议我应该使用三个片段并用数据更新左右片段,但这实际上让我失望了。谁能分享一个很好的例子或博客。

【问题讨论】:

  • 你基本上想实现一个测验应用程序,其中最多可以有 8 种类型的问题(8 种不同的问题布局),对吧? 所有页面中的数据都是动态的 - 如何动态?您是否打算在创建片段之后对其进行更改? 所有页面都可以被用户交互。 - 交互是什么意思?
  • 是的,你是对的,我想实施一个测验。动态数据意味着数据将来自 sqlite db 或 map 但不是硬编码的。是的,一旦创建了片段,我想用我的集合中的数据填充它。一些页面上有编辑文本,所有按钮都像提交答案,这样它就会被交互。
  • @Luksprog 你要建议什么吗因为我想将上面的代码编辑成我现在正在做的事情。
  • 更新问题。你的代码太复杂了,以至于你想做的事情。
  • @Luksprog 看看我的编辑,实际上我已经为每个布局创建了片段,并创建了一个片段列表,在需要时返回所需的布局。这是我的用例的正确方法吗,这种方法的问题是我无法在我的 viewpager 中更新页面滑动时的数据

标签: android android-fragments android-viewpager


【解决方案1】:

我必须清楚,我正在寻找一个可以找到的例子或答案 在 viewpager 和所有数据中使用各种不同的布局设计 页面将是动态的,所有页面都可以通过 用户。

这应该很容易制作,但您似乎把它复杂化了很多。你需要做这样的事情:

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

初始化ViewPager 并设置它的适配器。适配器将根据您拥有的任何标准,在 getItem() 方法中返回正确的片段实例。

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

我做了一个简单的例子,你可以找到here

【讨论】:

  • 知道了,我实际上是在通过在 onActivityCreated 中初始化我的视图而不是 onCreateView 来犯错误,但是您的这种方法确实有帮助。感谢您的宝贵时间和宝贵意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2015-10-05
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多