我必須明確,我正在尋找一個例子或答案,我可以在viewpager中使用各種不同的佈局設計,並且所有頁面中的數據將是動態的,並且所有頁面可以通過用戶。多佈局viewpager與一個片段
我的使用案例和對當前問題的辦法:
所以我有8種題型,所以我創建了layouts
爲他們所有。此外,我在這些佈局視圖中的數據必須通過java Map
填充,該數據已從sqlite數據庫中獲取數據。
但測試可能包含不同的佈局,25題出上述8和所有這些25個問題我想用一個Viewpager
和Fragment
將返回基於通過問題類型值所需的佈局在我的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類似,我也沒有其他的碎片太多。每個用於佈局類型。
問題:
- 第一佈局被重複兩次在第一時間,並且當我回來滑動然後數據的位置是錯誤的。
- 這是正確的方法,有人建議我應該使用三個片段並用數據更新左邊和右邊的片段,但這實際上反彈了我。任何人都可以分享一個很好的例子或博客。
你基本上要實現一個測驗的應用程序,其中有可能是一個最大的8種類型的問題(8點不同的問題的佈局)的,對不對? *並且所有頁面中的數據都是動態的* - 動態如何?在創建片段之後,您是否打算改變它? *和所有頁面都可以被用戶交互。* - 互動是什麼意思? – Luksprog
是的你是對的我想實施一個測驗。動態數據意味着數據將來自sqlite數據庫或映射,但不是硬編碼。是的,一旦片段被創建,我想用我的收藏中的數據填充它。有些頁面上的edittext和所有類似按鈕的提交答案,這樣它們就會被交互。 – Prateek
@Luksprog你打算推薦一些東西嗎?因爲我想編輯上面的代碼到我現在正在做的事情。 – Prateek