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

时间:2016-04-27 12:11:31

标签: android performance video photo

我有RecyclerView的活动。这个RecyclerView通过调用webservice动态填充(具有无限滚动,拉动刷新等等。)。
如果一个项目是照片,我只想显示它,如果它是一个视频,我希望有某种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)
  }
}

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

1 个答案:

答案 0 :(得分:1)

嘿,您可以在自定义适配器中创建两个不同的布局(一个使用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;
        ...
    }
}
}

我希望它会有所帮助。