java - 在 Android/Java 中使用 ViewHolder 的通用类

标签 java android templates generics

我希望能够返回我的子持有者之一的某个实例(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/

相关文章:

java - Bamboo 代理 - 错误 SSLPeerUnverifiedException : peer not authenticated

java - Spring "hello world"示例错误 : A JNI error has occured & NoClassDefFoundError: org/springframework/beans/factory/ListableBeanFactory

java - 对 map 中的日期字符串进行排序

java - 学生阵列菜单

android - 地理编码器,在 Android 中获取国家/地区,getFromLocation 零结果

android - API 'BaseVariant.getApplicationIdTextResource' 已过时,已替换为 'VariantProperties.applicationId'

java - 首选项菜单中的操作栏 Sherlock

python - 有什么方法可以让这个Python字符串语句更加Pythonic吗?

templates - 如何覆盖 MATLAB 中的默认文本

C++ SFINAE void_t 不工作