在同一视图中显示各种媒体
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;
...
}
}
}
希望对您有所帮助。
我有一个 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;
...
}
}
}
希望对您有所帮助。