我希望能够返回我的子持有者之一的某个实例(Base 是 GameHolder)。我在执行此操作时遇到困难,这就是我所遇到的:
@Override
public GameHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(mHolderMap.get(viewType).getLayoutResID(), parent, false);
//I'm trying to avoid using this switch by using a HashMap because it is going to continue growing as I add more leagues.
/*switch(viewType)
{
case -1:
view = inflater.inflate(R.layout.list_header_item, parent, false);
return new HeaderGameHolder(view, getActivity());
case 1:
view = inflater.inflate(R.layout.list_nba_game_item, parent, false);
return new NBAGameHolder(view, getActivity());
case 2:
view = inflater.inflate(R.layout.list_mlb_game_item, parent, false);
return new MLBGameHolder(view, getActivity());
default:
return null;
}*/
//this is where I'm having trouble, I don't know how to return the correct type.
Class<? extends GameHolder> myClass = mHolderMap.get(viewType).getHolderClass();
return new myClass(view, getActivity());
}
这是我的 HashMap 及其设置方法:
private HashMap<Integer, ViewMapHelper> mHolderMap = new HashMap<>();
private void setupGameHolderMap()
{
mHolderMap.put(LeagueInfo.headerID, new ViewMapHelper(R.layout.list_header_item, HeaderGameHolder.class));
mHolderMap.put(LeagueInfo.nbaID, new ViewMapHelper(R.layout.list_nba_game_item, NBAGameHolder.class));
mHolderMap.put(LeagueInfo.mlbID, new ViewMapHelper(R.layout.list_mlb_game_item, MLBGameHolder.class));
}
这是我的 ViewMapHelper 类:
private class ViewMapHelper
{
int mLayoutResID;
Class<? extends GameHolder> mHolderClass;
public ViewMapHelper(int layoutResID, Class<? extends GameHolder> holderClass)
{
mLayoutResID = layoutResID;
mHolderClass = holderClass;
}
public int getLayoutResID()
{
return mLayoutResID;
}
public Class<? extends GameHolder> getHolderClass()
{
return mHolderClass;
}
}
正如您在第一段代码中看到的,我的问题就在这里。第二行不起作用:
Class<? extends GameHolder> myClass = mHolderMap.get(viewType).getHolderClass();
return new myClass(view, getActivity());
我希望能够返回与 HashMap 中保存的类相对应的持有者类型。我对使用 Java 的泛型和模板类很陌生,所以希望有人能给我指出正确的方向。感谢您的帮助!
最佳答案
为此,您需要找到构造函数并调用它。
Constructor[] ctors = myClass.getDeclaredConstructors();
Constructor ctor = null;
for (int i = 0; i < ctors.length; i++) {
if (ctor.getGenericParameterTypes().length == 2) {
ctor = ctors[i];
break;
}
}
if (ctor != null) {
return ctor.newInstance(view, getActivity());
}
关于java - 在 Android/Java 中使用 ViewHolder 的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36564582/