如何创建一个ViewPager,其中包含动态创建的页面?页数没有限制。从头开始,用户可以左右导航(滑动)以获得上一页或下一页。因此,没有“页面0”(在列表中)。
一个应用程序可以是一本书。它可能是显示前几天数据或未来几天天气预报的天气(或数据)应用。 在书本情况下,重新启动应用程序后可能会出现在第35页上。当用户导航到上一页时,可以立即显示该第34页。所以-使用片段列表不起作用。
更新:因为创建了完整的解决方案,所以我从问题中删除了源代码。在Github的专案中。
答案 0 :(得分:0)
使ViewPager圆形的解决方案基于portfoliobuider's post和tobi_b's post的建议。
您可以在this Github project中找到一个很好的示例。每个页面(或片段)都是完全动态生成的。支持后退或前进(圆形)。当然,它以AndroidX为基础。
活动是:
public class MainActivity extends FragmentActivity {
static MainActivity mainActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivity = this;
if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content,
new PagerFragment()).commit();
}
}
}
PagerFragment是:
public class PagerFragment extends Fragment {
private static final int SET_ITEM_DELAY = 300;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View result=inflater.inflate(R.layout.pager, container, false);
final ViewPager pager= result.findViewById(R.id.pager);
pager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected( final int position) {
pager.postDelayed(new Runnable() {
@Override
public void run() {
handleSetCurrentItem(position);
}
}, SET_ITEM_DELAY);
}
@Override
public void onPageScrollStateChanged(int state) {
}
private void handleSetCurrentItem(final int position) {
final int lastPosition = pager.getAdapter().getCount() - 1;
if (position == 0) {
pager.setCurrentItem(lastPosition - 1, false);
} else if (position == lastPosition) {
pager.setCurrentItem(1, false);
}
}
});
pager.setAdapter(buildAdapter());
pager.setCurrentItem(1); // not 0 !!!
return(result);
}
private PagerAdapter buildAdapter() {
return(new SampleAdapter(getActivity(), getChildFragmentManager()));
}
}
SamplerAdapter是:
public class SampleAdapter extends FragmentStatePagerAdapter {
private int numberOfPages = 10;
Context ctxt = null;
public SampleAdapter(Context ctxt, FragmentManager mgr) {
super(mgr);
this.ctxt = ctxt;
}
@Override
public int getCount() {
return (numberOfPages + 2);
}
@Override
public Fragment getItem(final int position) {
if (position == 0) {
return (EditorFragment.newInstance(numberOfPages - 1));
} else if (position == numberOfPages + 1) {
return (EditorFragment.newInstance(0));
} else {
return (EditorFragment.newInstance(position - 1));
}
}
@Override
public String getPageTitle(int position) {
return (EditorFragment.getTitle(ctxt, position));
}
}
布局文件是:
<?xml version="1.0" encoding="utf-8"?>
<androidx.viewpager.widget.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- <androidx.viewpager.widget.PagerTitleStrip could be placed here -->
</androidx.viewpager.widget.ViewPager>
动态片段为:
public class EditorFragment extends Fragment {
private static final String KEY_POSITION = "position";
static EditorFragment newInstance(int position) {
EditorFragment frag = new EditorFragment();
Bundle args = new Bundle();
args.putInt(KEY_POSITION, position);
frag.setArguments(args);
return (frag);
}
static String getTitle(Context ctxt, int position) {
return (String.format(ctxt.getString(R.string.hint), position + 1));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.editor, container, false);
EditText editor = (EditText) result.findViewById(R.id.editor);
int position = getArguments().getInt(KEY_POSITION, -1);
editor.setHint(getTitle(getActivity(), position));
return (result);
}
}
它有一个非常简单的布局文件:
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="textMultiLine"
android:gravity="left|top" />
这很好用!