具有一个片段的多个布局 viewpager [英] multiple layout viewpager with one fragment

查看:24
本文介绍了具有一个片段的多个布局 viewpager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

So I have got 8 different types of question types and so I have created layouts for all of them. Also I the data in the views for these layouts has to be populated via java Map that has fetched data from the sqlite DB.

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

But a test may contain 25 questions with different layouts out of the above 8. And for all these 25 questions I want to use a Viewpager and a Fragment that will return the required layout based on the passed question type value out of my java map.

我对此的看法:

我创建了一个 Activity 并使用 viewpager 布局对其进行了膨胀:

I have created an activity and have inflated it with a viewpager layout :

R.layout.practice_pager

*活动编辑代码*

       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 编辑的代码

public class TestFragment extends Fragment {

public class TestFragment extends Fragment {

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 和所有数据中使用各种不同的布局设计页面将是动态的,所有页面都可以通过用户.

I must clear that I am looking for an example or answer where I can use various differnt layout designs in a viewpager and the data in all the pages would be dynamic and all pages can be interacted by the user.

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

This should be quite easy to make but you seem to have complicated this a lot. You need to do something like this:

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

Get the data from the database with the LoadingTestView(); function.

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

Initialize the ViewPager and set it's adapter. The adapter will return the proper fragment instance in the getItem() method, based on whatever criteria you have.

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

In the fragments, retrieve the data from the activity which should expose the data through some method.

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

I've made a simple example that you can find here.

这篇关于具有一个片段的多个布局 viewpager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆