在同一视图中显示各种媒体

Displaying various medias in the same view

我有一个 activity 和一个 RecyclerView。此 RecyclerView 通过调用网络服务动态填充(具有无限滚动、下拉刷新等功能)。
如果一个项目是照片我只想显示它,如果它是视频我想要某种 MediaController 以便能够直接从列表中播放它。
我已经用这个布局实现了我想要的东西(这里是简化的):

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

在我的 RecyclerView.Adapter 中,我执行以下操作:

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

但这有时似乎会导致一些裁剪问题,如果我在这里没有使用不好的做法,我会徘徊。
所以问题如下:在性能方面实现我想做的事情的最佳方法是什么(我的滚动必须非常流畅)?

嘿,您可以在自定义适配器中创建两种不同的布局(一种使用 imageView,另一种使用 videoView)和两个视图容器。像那样:

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

希望对您有所帮助。