2013-08-07 133 views
2

我必須明確,我正在尋找一個例子或答案,我可以在viewpager中使用各種不同的佈局設計,並且所有頁面中的數據將是動態的,並且所有頁面可以通過用戶。多佈局viewpager與一個片段

我的使用案例和對當前問題的辦法:

所以我有8種題型,所以我創建了layouts爲他們所有。此外,我在這些佈局視圖中的數據必須通過java Map填充,該數據已從sqlite數據庫中獲取數據。

但測試可能包含不同的佈局,25題出上述8和所有這些25個問題我想用一個ViewpagerFragment將返回基於通過問題類型值所需的佈局在我的java地圖中。

我對這個apporach:

我已經創建了一個活動,並與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; 
     } 
    } 

接口FragmentData

public interface FragmentData { 
    public void setData(GrePracticeTestRecord p); 
    public GrePracticeTestRecord getData(); 
} 

TestFragment編輯的代碼

公共類TestFra gment擴展片段{

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類似,我也沒有其他的碎片太多。每個用於佈局類型。

問題:

  • 第一佈局被重複兩次在第一時間,並且當我回來滑動然後數據的位置是錯誤的。
  • 這是正確的方法,有人建議我應該使用三個片段並用數據更新左邊和右邊的片段,但這實際上反彈了我。任何人都可以分享一個很好的例子或博客。
+0

你基本上要實現一個測驗的應用程序,其中有可能是一個最大的8種類型的問題(8點不同的問題的佈局)的,對不對? *並且所有頁面中的數據都是動態的* - 動態如何?在創建片段之後,您是否打算改變它? *和所有頁面都可以被用戶交互。* - 互動是什麼意思? – Luksprog

+0

是的你是對的我想實施一個測驗。動態數據意味着數據將來自sqlite數據庫或映射,但不是硬編碼。是的,一旦片段被創建,我想用我的收藏中的數據填充它。有些頁面上的edittext和所有類似按鈕的提交答案,這樣它們就會被交互。 – Prateek

+0

@Luksprog你打算推薦一些東西嗎?因爲我想編輯上面的代碼到我現在正在做的事情。 – Prateek

回答

3

我必須明確一點,我正在尋找一個例子或回答,我可以 使用在viewpager各種不同的充佈局設計和數據在所有 頁面將是動態的,所有頁面可以通過互動 用戶。

這應該是很容易做出來的,但你似乎很複雜這很多。你需要做這樣的事情:

與LoadingTestView從數據庫中獲取的數據();功能。

初始化ViewPager,並設置它的適配器。根據您擁有的任何標準,適配器將在getItem()方法中返回適當的片段實例。

在片段,檢索應通過一些方法暴露出數據活性的數據。

我做了一個簡單的例子,你可以找到here

+0

明白了,我actualy被初始化onCreateView'的'了'onActivityCreated' inspite內我的意見做的錯誤,但這種方法由你真的幫了。感謝您的寶貴時間和寶貴意見 – Prateek