2016-04-12 12 views
0

Çocuk sahiplerimden birinin belirli bir örneğini (Base is GameHolder) döndürmek istiyorum.Android/Java'da bir ViewHolder kullanan genel sınıflar

İşte
@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()); 
} 

benim HashMap ve onun kurulum yöntemidir: Burada ben ne var, bunu sorun yaşıyorum

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; 
    } 
} 

: Burada

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)); 
} 

benim ViewMapHelper sınıftır Kodun ilk bloğunda görebileceğiniz gibi, benim sorunum burada. İkinci satır çalışmaz:

Class<? extends GameHolder> myClass = mHolderMap.get(viewType).getHolderClass(); 
return new myClass(view, getActivity()); 

Ben karma haritasında kaydedilen sınıfa karşılık gelen tutucu türü dönmek isterler. Java'nın jenerik ve şablon sınıflarını kullanmakta yeniyim, bu yüzden birilerinin bana doğru yönde yönlendirebileceğini umuyorum. Herhangi bir yardım için teşekkürler!

cevap

1

Bunun için kurucuyu bulup çağırmalısınız.

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()); 
} 
0

Bu konuda bir süre çalıştıktan sonra sorunu çözebildim. Bu yüzden umarım, RecyclerView öğelerinde mulitple viewtypes kullanan birisine yardımcı olur ve ViewHolders'ı uzun bir anahtar kullanmadan ya da eğer/ifadesi olursa// iftarsa ​​hızlı bir şekilde oluşturmak ister.

private class ViewMapHelper 
{ 
    int mLayoutResID; 
    GameHolderInterface mGameIntObj; 

    public ViewMapHelper(int layoutResID, GameHolderInterface gameIntObject) 
    { 
     mLayoutResID = layoutResID; 
     mGameIntObj = gameIntObject; 
    } 

    public int getLayoutResID() 
    { 
     return mLayoutResID; 
    } 

    public GameHolderInterface getGameHolderInt() 
    { 
     return mGameIntObj; 
    } 
} 

Sonra HashMap (mHolderMap) için kurulum modifiye:

Ben arayüzü kullanmak benim ViewMapHelper sınıf modifiye Sonra

interface GameHolderInterface 
{ 
    GameHolder getNewGameHolder(View itemView); 
} 

:

Ben ilk bir arabirim yapılan

private void setupGameHolderMap() 
{ 
    mHolderMap.put(LeagueInfo.headerID, new ViewMapHelper(R.layout.list_header_item, new GameHolderInterface() { 
     @Override 
     public GameHolder getNewGameHolder(View itemView) 
     { 
      return new HeaderGameHolder(itemView, mMainActivity); 
     } 
    })); 

    mHolderMap.put(LeagueInfo.nbaID, new ViewMapHelper(R.layout.list_nba_game_item, new GameHolderInterface() { 
     @Override 
     public GameHolder getNewGameHolder(View itemView) 
     { 
      return new NBAGameHolder(itemView, mMainActivity); 
     } 
    })); 

    mHolderMap.put(LeagueInfo.mlbID, new ViewMapHelper(R.layout.list_mlb_game_item, new GameHolderInterface() { 
     @Override 
     public GameHolder getNewGameHolder(View itemView) 
     { 
      return new MLBGameHolder(itemView, mMainActivity); 
     } 
    })); 
} 

Ve sonra onCreateViewHolder() Hayır w vardır:

@Override 
public GameHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    LayoutInflater inflater = LayoutInflater.from(getActivity()); 
    ViewMapHelper vmh = mHolderMap.get(viewType); 
    View view = inflater.inflate(vmh.getLayoutResID(), parent, false); 

    return vmh.getGameHolderInt().getNewGameHolder(view); 
} 

Yani anahtar bir arabirim kullanmak ve daha sonra bu yüzden o GameHolder belirli türde bir erişmek için getNewGameHolder() çağırabilir benim ViewMapHelper sınıfında üye yapmaktı.

İlgili konular