我有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)
}
}
但这似乎有时会引起一些剪裁问题,如果我在这里没有使用不好的做法,我会徘徊。
所以问题如下:在性能方面实现我想要做的最好的方法是什么(我的滚动必须非常流畅)?
答案 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;
...
}
}
}
我希望它会有所帮助。