我正在尝试创建一个基类fragmentstatepageradapter,我希望getItem方法返回一个新的片段实例,但我希望该片段具有任何可能的子类型。我认为它会是这样的,但它引发了一个错误:
@Override
public Fragment getItem( int position ) {
if( mRosterUids == null || mRosterUids.size() <= position )
return null;
Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
return getItemClass().newInstance(mRosterUids.get(position));
}
public java.lang.Class<SLRosterDetailsFragment> getItemClass() {
return SLRosterDetailsFragment.class;
}
错误消息来自newInstance中的mRosterUids.get(position),它说
“类中的newInstance()不能应用于(java.lang.String)”
并且不灵活的工作版本是:
@Override
public Fragment getItem( int position ) {
if( mRosterUids == null || mRosterUids.size() <= position )
return null;
Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
return SLRosterDetailsFragment.newInstance(mRosterUids.get(position));
}
这是否可以使用,或者我应该让我的子函数覆盖getItem以返回自己的片段。
答案 0 :(得分:0)
将getItemClass()更改为
public <T extends Object> T getItemClass() { return SLRosterDetailsFragment.class; }
答案 1 :(得分:0)
在您的代码中,您间接执行:
return SLRosterDetailsFragment.class.newInstance(mRosterUids.get(position));
,
您从newInstance()
派生的类java.lang.Class
执行方法SLRosterDetailsFragment.class
,并且是2个完全不同的对象。
在工作期间&#39;正在执行的版本:
return SLRosterDetailsFragment.newInstance(mRosterUids.get(position));
班级SLRosterDetailsFragment
有一个名为newInstance
这是两种不同的方法......
答案 2 :(得分:-1)
感谢您的回答,伙计们。我在软件工程方面非常环保(初级开发,第一份工作),所以只是想看看我是否可以使我的适配器更具可扩展性,以后更容易使用。在阅读了评论并玩了一些东西后,我突然意识到有一个更简单的方法可以解决这个问题......
@Override
public Fragment getItem( int position ) {
if( mRosterUids == null || mRosterUids.size() <= position )
return null;
Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
return getRosterDetailsFragment( mRosterUids.get(position) );
}
public SLRosterDetailsFragment getRosterDetailsFragment( String uid ) {
return SLRosterDetailsFragment.newInstance( uid );
}
我确信我甚至可以将返回类型转换为Fragment,但是呃。谢谢大家!