【发布时间】:2013-08-07 07:47:43
【问题描述】:
我必须清楚,我正在寻找一个示例或答案,我可以在其中使用各种不同的布局设计在 viewpager 中,并且所有页面中的数据都是动态的,并且所有页面都可以由用户进行交互。
我的用例和当前解决问题的方法:
所以我有 8 种不同类型的问题类型,所以我为所有这些类型创建了 layouts。此外,这些布局的视图中的数据必须通过已从 sqlite DB 获取数据的 java Map 填充。
但测试可能包含上述 8 个问题中的 25 个不同布局的问题。对于所有这 25 个问题,我想使用 Viewpager 和 Fragment,它们将根据通过 问题类型值来自我的 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