带有一个片段的多个布局查看器 [英] multiple layout viewpager with one fragment

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

问题描述

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

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

所以我有 8 种不同类型的问题类型,因此我为所有这些类型创建了 layouts.此外,这些布局的视图中的数据必须通过已从 sqlite DB 获取数据的 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.

但一个测试可能包含上述 8 个问题中的 25 个不同布局的问题.对于所有这 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.

我对此的看法:

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

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

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 扩展片段 {

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

问题:

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

推荐答案

我必须清楚,我正在寻找一个可以找到的例子或答案在 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.

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

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