2016-12-24 8 views
1

私は小さな問題があります。私はRecyclerViewに複数の異なるレイアウトを表示しようとしています。私は2つの異なる方法でこれを行うことができました。しかし、私のコードとロジックがはるかによく見えるように感じるアダプターで複数の異なるレイアウト

私のプロジェクト自体は、MVVMデザインパターンに従っています。だから私はネイティブデータバインディングを使用しています。これが私の論理が問題になっている理由です。

私はこれを実行しようとした最初の方法でそれをやっての

最初の方法は、単に大きなレイアウトファイルにすべてをけいれんすることです。次に、それがあった投稿の種類に応じて非表示にして表示します。

private void onBindImagePost(CommentFeedViewHolder holder, CommentFeedItem item) { 
    holder.mBinding.adapterCommentFeedDraweeView.setVisibility(View.VISIBLE); 
    holder.mBinding.adapterCommentFeedTopic.setVisibility(View.VISIBLE); 
    holder.mBinding.adapterCommentFeedYoutubeContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedVideoContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedPieChartContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedDraweeView.setImageURI(item.getUri()); 
    } 

まずは、使用中のビューを表示して非表示にするだけです。私はまた、いくつかのビューに余分なロジックを追加しました。

このソリューションはハードコーディングが多く含まれており、ビジネスロジックがフラグメントに追加されているため、非常に悪いと感じました。それをやっての

第二の方法は、

は、私は、各ポストのために新しいレイアウトファイルを追加しました。彼らはすべて彼ら自身の拘束力を持っています。 これによりコードが最小限に抑えられました。

if (item.getType() == POST_TEXT) { 
     AdapterFeedType1Binding binding = DataBindingUtil.inflate(inflater,R.layout.adapter_feed_type_1,holder.binding.mainFrame,true); 
     binding.setGameFeedItem(item); 
    } 

もっと良い方法がありますか?だから私はポストのすべてのタイプの新しいバインディングクラスを作成する必要はありません?

答えて

2

2番目のオプションが優れています。 、このシステム

private static final int[] LAYOUT_IDS = { 
    R.layout.adapter_feed_type_1, 
    R.layout.adapter_feed_type_2, 
    ...}; 


public MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
    int layoutId = LAYOUT_IDS[viewType]; 
    ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, 
     parent, false); 
    MyViewHolder viewHolder = new MyViewHolder(binding); 
    return viewHolder; 
} 

public void onBindViewHolder (MyViewHolder holder, int position) { 
    Item item = getItemAtPosition(position); // your method 
    holder.binding.setVariable(BR.gameFeedItem, item); 
    holder.binding.executePendingBindings(); 
} 

限り、すべての変数は、同じ名前が付けられて(この場合はgameFeedItem):まだそこに生成された複数の結合のクラスになりますが、あなたはこのようにそれを行う場合は、単一のインターフェイスを介してそれらにアクセスすることができます働くでしょう。私は、MyViewHolderという名前のViewHolderが、Bindingをpublic finalフィールドとして持つと仮定しています。

+1

ViewDataBindingは、探していたものの、見つけられなかったものです。どうもありがとう。これは私がクリーンなソリューションを作成するのに役立ちました –

関連する問題