2016-04-27 7 views
0

私はRecyclerViewでアクティビティを持っています。このRecyclerViewは、Webサービス(無限のスクロール、リフレッシュなど)の呼び出しによって動的に設定されます。
1つのアイテムが写真の場合、表示したいだけです。ビデオの場合は、MediaControllerのようなものをリストから直接再生することができます。
私はすでに私はこのレイアウトで欲しいもののようなもの(ここでは簡略化されています)達成:同じビューでさまざまなメディアを表示

@Override 
public void onBindViewHolder(MyViewHolder viewHolder, int position) { 
    if (event.isVideo) { 
     viewHolder.img.setVisibility(View.INVISIBLE); 
     // loading video here 
    } 
    else { 
     viewHolder.vid.setVisibility(View.INVISIBLE); 
     // loading photo here (Glide is used to achieve this) 
    } 
} 

が、これは、いくつかのクリッピングを起こしているように見える:私のRecyclerView.Adapter私は次の操作を行いでは

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:gravity="center_horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@android:color/white" 
      android:layout_marginBottom="7dp" > 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="300dp"> 

     <ImageView 
      android:id="@+id/field_picture" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      /> 
     <VideoView 
      android:id="@+id/field_video" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      /> 

    </LinearLayout> 
</LinearLayout> 

を時々問題が発生し、ここで悪い練習をしていないと私は歩き回ります。
質問は次のとおりです。私はパフォーマンスの面で何をしたいのかを達成する最良の方法は何ですか(私のスクロールは本当に流動的でなければなりません)?

答えて

1

あなたは、カスタムアダプターに2つの異なるレイアウト(1つはimageView、もう1つはvideoView)と2つのビューホルダーを作成できます。そのように:

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

private static final int VIEW_TYPE_VIDEO = 0; 
private static final int VIEW_TYPE_IMAGE = 1; 

class ViewHolderVideo extends RecyclerView.ViewHolder { 
    ... 
} 

class ViewHolderImage extends RecyclerView.ViewHolder { 
    ... 
} 

@Override 
int getItemViewType(int position) { 
    if (event.isVideo) { 
    return VIEW_TYPE_VIDEO; 
    } 
    else { 
    return VIEW_TYPE_IMAGE; 
    } 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case VIEW_TYPE_VIDEO: 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item_video, parent, false); 
      return new ViewHolderVideo(v); 
     case VIEW_TYPE_IMAGE: 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item_image, parent, false); 
      return new ViewHolderImage(v); 
     ... 
    } 
} 

@Override 
public void bindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    switch (getItemViewType(position)) { 
     case VIEW_TYPE_VIDEO: 
      ViewHolderVideo viewHolderVideo = (ViewHolderVideo)holder; 
      ... 
      break; 
     case VIEW_TYPE_IMAGE: 
      ViewHolderImage viewHolderImage = (ViewHolderSecond)holder; 
      ... 
      break; 
     ... 
    } 
} 
} 

私はそれが役に立ちそうです。

+0

うまくいけば、私はちょうど私の異なるViewHoldersの抽象クラスで少し微調整しました! thx – Jonsmoke

+0

いいアイデア:)あなたの歓迎 – Chami

関連する問題