2016-10-28 7 views
0

私は実際の問題の多くですが質問があります。 私は、それぞれ異なる情報を持つ複数のカードを持つアプリケーションを作成しています。私はCardViewAdapterとの内部にを作成しています。各カード用にViewHoldersを作成します。すべてがうまくいきます。複数の入れ子にされたViewHoldersを持つCardViewAdapter

私の質問は、ネストされたクラスを作成するより良い方法はありますか?なぜなら私はCardViewAdapterを読みにくくする200行以上のコードを持つ5つのViewHoldersを持っているからです。それを行うより実用的な方法はありますか、それともそれほど大丈夫ですか?私は別のことをやって、完全に異なるレイアウトを持っている5 ViewHolders内部の基本的

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 
} 

}

+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が書いた整数データバインディング技術があり、自動的に同様のコードを生成することができます。別のスタジオを使用している場合は、データバインディングライブラリがあります。 –

関連する問題