2016-10-28 21 views
0

我有一個更實際的問題。 我正在創建一個具有多張卡片的應用程序,每張卡片都有不同的信息。我在創建CardViewAdapter和裏面我爲每張卡創建我的ViewHolders。一切運作良好。CardViewAdapter與多個嵌套的ViewHolders

我的問題是 - 是否有更好的方式來創建嵌套類?因爲我有5個ViewHolders,每個有200多行代碼,這使得我的CardViewAdapter非常難以閱讀。有沒有更實際的方法做到這一點,或者這樣很好?

public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.ViewHolder> { 

private Context mContext; 

public CardViewAdapter(Context context) { 
    mContext = context; 
} 

private String[] mDataSet; 
private int[] mDataSetTypes; 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    Context context = viewGroup.getContext(); 
    View v; 
    ViewHolder holder; 


    if(viewType == 0){ 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card1, viewGroup, false); 
     return new Card1ViewHolder(v); 
    } else if(viewType == 1) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card2, viewGroup, false); 
     return new Card2ViewHolder(v); 
    } else if(viewType == 2) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card3, viewGroup, false); 
     return new Card3ViewHolder(v); 
    } else if(viewType == 3) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card4, viewGroup, false); 
     return new Card4DialerViewHolder(v); 
    } else if(viewType == 4) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card5, viewGroup, false); 
     return new Card5SettingsViewHolder(v); 
    } else { 
     return null; 
    } 
} 

@Override 
public void onBindViewHolder(CardViewAdapter.ViewHolder holder, int position) { 

} 

@Override 
public int getItemCount() { 
    return 5; 
} 

@Override 
public int getItemViewType(int position) { 
    int viewType = 0; 

    if(position == 0){ 
     viewType = 0; 
    } else if (position == 1){ 
     viewType = 1; 
    } else if (position == 2){ 
     viewType = 2; 
    } else if (position == 3){ 
     viewType = 3; 
    } else if (position == 4){ 
     viewType = 4; 
    } 
    return viewType; 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 
    public ViewHolder(View v) { 
     super(v); 

    } 
} 

private class Card1ViewHolder extends ViewHolder{ 
    //layout 1 
} 

private class Card2ViewHolder extends ViewHolder{ 
    //layout 2 
} 

private class Card3ViewHolder extends ViewHolder { 
    //layout 3 
} 

private class Card4ViewHolder extends ViewHolder { 
    //layout 4 
} 

private class Card5ViewHolder extends ViewHolder { 
    //layout 5 
} 

}

基本上5個ViewHolders裏面我有完全不同的佈局做不同的事情。

+0

Wtf?如果你想使用具有不同內容的卡片,請製作一個通用的'ViewHolder'和'CardItem',以便動態設置結構。 –

+0

將更多關於卡內所有內容的信息。沒有它,我不會寫更多。 –

+0

或'CardViewAdapter'代碼。 –

回答

1

聲明一個基類:

public abstract class Binder { 
    public abstract void bind(View view, Hash<Integer, Object> values); 
} 

所以,你可以重寫它所有卡的意見。 下,申報項目類:

public class CardItem { 
    public HashMap<Integer, Object> values; 
    public int type; 
    public Binder binder; 
    public bind(View view) {binder.bind(view, values);} 
} 

因此,在數據綁定,您可以填寫它像item.bind(holder.view);。 使用item.type創建具有正確佈局的ViewHolder

+0

老實說,你的問題有+100500解決方案,但最好的是數據綁定。 Android Studio擁有整合的數據綁定技術,如@pskink給你寫的,它可以自動生成類似的代碼。或者如果你使用另一個工作室,它有一個數據綁定庫。 –