我今天注意到PagerAdapter被大量调用.当慢慢滚动页面时,我计算了393.我看到了这个问题,但它并没有给我一个很好的答案.
为了清楚起见,我正在寻找一个比所提问题更广泛的答案.我也意识到我需要保持它的速度,并且我无法控制它的调用方式,但这不是问题所在.
我很好奇为什么instantiateItem
被弃用以支持它的新版本.变化是它现在接受ViewGroup
而不是更普遍View
.
不推荐的方法
public Object instantiateItem (View container, int position)
Run Code Online (Sandbox Code Playgroud)
新方法
public Object instantiateItem (ViewGroup container, int position)
Run Code Online (Sandbox Code Playgroud)
注意:这种变化也发生在destroyItem
,startUpdate
,finishUpdate
和setPrimaryItem
.
我已经使用Android的分页库(https://developer.android.com/topic/libraries/architecture/paging.html)实现了分页回收视图.它在获取数据和检索后续页面时工作正常.但是,如何过滤PagedList?假设我有一个搜索小部件,我想搜索当前屏幕上的列表.PagedList.filter()
返回a List
并且PagedListAdapter.setList()
不接受a List
.
我在此活动中收到IllegalStateException但不太确定发生了什么.这是QuickContactActivity中的ViewPagerAdapter类.
private class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
QuickContactListFragment fragment = new QuickContactListFragment();
final String mimeType = mSortedActionMimeTypes.get(position);
final List<Action> actions = mActions.get(mimeType);
fragment.setActions(actions);
return fragment;
}
@Override
public int getCount() {
return mSortedActionMimeTypes.size();
}
}
Run Code Online (Sandbox Code Playgroud)
这是崩溃日志:
07-15 09:49:21.060: E/com.##.##.##.Application(12378): Thread uncaught exception:
07-15 09:49:21.060: E/com.##.##.##.Application(12378): java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 1 Pager id: com.##.##.android:id/item_list_pager Pager class: …
Run Code Online (Sandbox Code Playgroud) android illegalstateexception fragmentpageradapter android-pageradapter
我正在实现一个Pager Adapter Fragment
.当我第一次加载屏幕时,它工作正常.如果我切换到其他片段并再次转到上一个片段,它会显示空屏幕.如果我在不同的点击之间滑动并再次移动到第一个标签,则会显示数据.
我认为在向后移动可见的标签时没有加载数据,但是一旦它们在滑动导航期间不在视图中,它就会加载数据.
这是我的寻呼机适配器:
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
case 3:
return new Fragment4();
case 4:
return new Fragment5();
case 5:
return new Fragment6();
}
return null;
}
@Override
public int getCount() {
return 6;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在设置我的适配器:
viewPager = (ViewPager) rootView.findViewById(R.id.my_pager);
mAdapter = new …
Run Code Online (Sandbox Code Playgroud) 我在实现自定义PagerAdapter时遇到问题,并将其与ViewPager一起使用.此示例PagerAdapter有10个项目,每个项目都是一个按钮,其索引为文本.当我运行程序时,我看到一个文本"1"的按钮为"0".当我刷到其他项目时,我只得到空白视图.当我向后滑动时有时会看到一个带有一些数字的按钮,但它会消失(可能它正在破坏并将其从容器中移除),有时我会看到一个带有数字的按钮,但数字在刷卡后会发生变化(我认为我创建了一个新的Button,然后将其添加到容器中,由于某些原因,viewpager显示了这个新按钮.
我该如何解决这个实现?我没有看到例子中的差异.
我的PagerAdapter实现:
public class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return 10;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return o.getClass()==view.getClass();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Button button = new Button(container.getContext());
ViewGroup.LayoutParams params = new ActionBar.LayoutParams(-1,-1);
button.setLayoutParams(params);
button.setText(String.valueOf(position));
container.addView(button);
return button;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((Button)object);
}
}
Run Code Online (Sandbox Code Playgroud)
我的活动:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); …
Run Code Online (Sandbox Code Playgroud) 我有一个ViewPager w /负边距设置为获得这样的效果:
现在,我想要发生的是当我点击当前视图左侧或右侧的视图时.它应该选择该视图并在ViewPager上调用setCurrentItem().这适用于当前项右侧的视图,但不适用于当前项左侧的视图.当我点击该视图时,报告给我的位置是当前视图的位置.
如果它有帮助,这里有一些代码.这是来自PagerAdapter.instantiateItem(),我在onClick()上触发:
@Override
public Object instantiateItem(final ViewGroup container, final int position)
{
cardLayout.setTag(profile);
cardLayout.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
// mOnItemClickListener passed in to adapter on initialization
mOnItemClickListener.onItemClick(null, view, position, 0);
// other stuff happens here as well
}
});
}
Run Code Online (Sandbox Code Playgroud)
整个PagerAdapter类适用于任何有兴趣的人:
static class GiveTenPagerAdapter extends PagerAdapter
{
private final int ANIMATION_DURATION;
private ListenerOnGiveTakeClick mListenerOnGiveTakeClick;
private List<GiveTen> mGiveTens;
private Context mContext;
private LayoutInflater mInflater;
private boolean mIsCrossFadeAnimationRunning;
private int mSquarePhotoSideLength;
GiveTenPagerAdapter(List<GiveTen> giveTens, Context context, …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个有ViewPager视图的应用程序,我创建了一个PagerAdapter,它有视图,PagerAdapter的instantiateItem()方法在create()中被调用两次我不知道为什么,任何人都可以帮助我这个?
这是我的代码,
View PagerView;
MyPagerAdapter adapter;
ViewPager pager;
adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setCurrentItem(0);
public class MyPagerAdapter extends PagerAdapter {
@Override
public Object instantiateItem(final View collection, final int position) {
Log.d("Inside", "Pager");
PagerView = new View(collection.getContext());
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
PagerView = inflater.inflate(R.layout.tablemenu, null, false);
tbMenuDetails = (TableLayout) PagerView
.findViewById(R.id.Menutable1);
scrollview = (ScrollView) PagerView.findViewById(R.id.scrollView1);
tbMenuDetails.removeAllViews();
removeTableRows();
createTableLayout(position);
String str[][] = datasource.GetSubMenuDetailsFromMenuId(MenuIdlst
.get(position).trim());
Log.d("Str", "" + str.length);
for (int i = 0; i < str.length; i++) {
addRows(str[i][1], str[i][2], …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用viewpager和片段制作幻灯片,这样我就可以为每个片段加载不同的布局,并为每个页面提供不同的功能.
我按照教程来完成这个.
我在悬停时遇到的错误public Fragment getItem(int arg0)
:返回类型与之不兼容FragmentPagerAdapter.getItem(int)
和错误#2:构造函数FragmentPagerAdapter(FragmentManager)
未定义 - >在悬停时获取此构造函数super(fm);
package com.example.spui;
import android.os.Bundle;
import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
final int PAGE_COUNT = 5;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
MyFragment myFragment = new MyFragment();
Bundle data = new Bundle();
data.putInt("current_page", …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter android-pageradapter
FragmentPagerAdapter
ViewPager与OffScreenLimit设置为1和FragmentStatePagerAdapter
?之间有什么区别?
关于FragmentPagerAdapter
Google的指南说:
此版本的寻呼机最适合在有少量通常更多静态片段进行分页时使用,例如一组选项卡.用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁.这可能导致使用大量内存,因为片段实例可以保持任意数量的状态.对于较大的页面集,请考虑FragmentStatePagerAdapter.
关于FragmentStatePagerAdapter
:
当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器,代价是在页面之间切换时可能具有更多的开销.
我想如果我将offscreenlimit设置为1,它会破坏当前片段的下两个片段之外的所有片段,并且它的行为类似于FragmentStatePagerAdapter.它是否正确?
android android-fragments android-viewpager android-pageradapter