Horizontal recyclerview inside Android vertical recyclerview
I'm trying to do such a thing
Therefore, my idea is that I have a vertical recyclerview with a channel, and in the second position of the channel, I should have a horizontal recyclerview with replay
I'm not sure what to do. I tried to mess up the viewholder and guess I should only be in my own channel_ Create a recyclerview in the details layout and add it to the item_ channel_ The other is made into an item in details, but I can't make it work
This is my code
ChannelDetailsActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_channel_details);
ImageView coverPhoto = (ImageView) findViewById(R.id.image_cover_details);
final HexagonImageView avatarPhoto = (HexagonImageView) findViewById(R.id.img_hex);
TextView toolbarText = (TextView) findViewById(R.id.txt_toolbar_title);
final Bundle b = getIntent().getExtras();
final MNetworkChannel parcelChannel =
b.getParcelable(Const.IntentData.H_CHANNEL_LIST);
final MVideosForChannel parcelVideosForChannel = b.getParcelable(Const.IntentData.D_VIDEOS_LIST);
setChannelsView();
setVideosView();
}
private void setChannelsView() {
rvRelive = (RecyclerView) findViewById(R.id.rv_relive_details);
rvRelive.setLayoutManager(new linearlayoutmanager(this, linearlayoutmanager.HORIZONTAL, false));
adapterRelives = new ReliveAdapter();
rvRelive.setAdapter(adapterRelives);
if (getIntent() != null && getIntent().getParcelableExtra(Const.IntentData.D_RELIVE_LIST) != null) {
adapterRelives.setData(((ReliveMainPojo) getIntent().getParcelableExtra(Const.IntentData.D_RELIVE_LIST)).relives);
}
}
private void setVideosView() {
rvVideos = (RecyclerView) findViewById(R.id.rv_videos);
rvVideos.setLayoutManager(new linearlayoutmanager(this, linearlayoutmanager.VERTICAL, false));
adapterVideos = new ChannelVideosAdapter();
rvVideos.setAdapter(adapterVideos);
if (getIntent() != null && getIntent().getParcelableExtra(Const.IntentData.D_VIDEOS_LIST) != null) {
adapterVideos.setData(((MVideosForChannel) getIntent().getParcelableExtra(Const.IntentData.D_VIDEOS_LIST)).experience);
}
}
Channeldetails adapter:
public final class ChannelVideosAdapter extends RecyclerView.Adapter<ChannelVideosAdapter.ViewHolder> {
private List<MVideo> data = new ArrayList<>();
public ChannelVideosAdapter() {
}
public void setData(List<MVideo> newData) {
if (newData != null && !newData.isEmpty()) {
data = newData;
notifyDataSetChanged();
}
}
public void clearData() {
data.clear();
notifyDataSetChanged();
}
@Override
public final ChannelVideosAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_video_recycle_tile, parent, false));
}
@Override
public final void onBindViewHolder(final ChannelVideosAdapter.ViewHolder holder, final int position) {
final MVideo video = data.get(position);
final String videoBackgroundImageUrl = video.asset.frame;
final String videoName = video.name;
ImageLoader.getInstance().displayImage(videoBackgroundImageUrl, holder.coverPhoto, new ImageLoadingListener() {
@Override
public void onl oadingStarted(String imageUri, View view) {
holder.videoLoading.setVisibility(View.VISIBLE);
}
@Override
public void onl oadingFailed(String imageUri, View view, FailReason failReason) {
holder.videoLoading.setVisibility(View.GONE);
}
@Override
public void onl oadingComplete(String imageUri, View view, Bitmap loadedImage) {
holder.videoLoading.setVisibility(View.GONE);
}
@Override
public void onl oadingCancelled(String imageUri, View view) {
holder.videoLoading.setVisibility(View.GONE);
}
});
holder.videoName.setText(videoName);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VideoPlayerActivity.StartNewVideoPlayerActivity((ChannelDetailsActivity) holder.itemView.getContext(), video, true);
}
});
}
@Override
public final int getItemCount() {
return data.size();
}
final class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView coverPhoto;
private final TextView videoName;
private final ProgressBar videoLoading;
ViewHolder(final View itemView) {
super(itemView);
coverPhoto = (ImageView) itemView.findViewById(R.id.img_thumbnail_background_video);
videoName = (TextView) itemView.findViewById(R.id.txt_video_name);
videoLoading = (ProgressBar) itemView.findViewById(R.id.pb_video_loading);
}
}
}
Restart the adapter:
public final class ReliveAdapter extends RecyclerView.Adapter<ReliveAdapter.ViewHolder> {
private List<Relive> data = new ArrayList<>();
public ReliveAdapter() {
}
public void setData(List<Relive> newData) {
if (newData != null && !newData.isEmpty()) {
data = newData;
notifyDataSetChanged();
}
}
public void clearData() {
data.clear();
notifyDataSetChanged();
}
@Override
public final ReliveAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_relive_recycle_tile, parent, false));
}
@Override
public void onBindViewHolder(final ReliveAdapter.ViewHolder holder, final int position) {
final Relive relive = data.get(position);
final String reliveOwnerIconUrl = relive.owner.asset.large;
final String reliveCoverPhotoUrl = relive.asset.stream.thumbnail;
final String reliveDescription = relive.owner.name;
ImageLoader.getInstance().displayImage(reliveCoverPhotoUrl, holder.backgroundImage, new ImageLoadingListener() {
@Override
public void onl oadingStarted(String imageUri, View view) {
holder.imageLoading.setVisibility(View.VISIBLE);
}
@Override
public void onl oadingFailed(String imageUri, View view, FailReason failReason) {
holder.imageLoading.setVisibility(View.GONE);
}
@Override
public void onl oadingComplete(String imageUri, View view, Bitmap loadedImage) {
holder.imageLoading.setVisibility(View.GONE);
ImageLoader.getInstance().displayImage(reliveOwnerIconUrl, holder.profilePicture, new ImageLoadingListener() {
@Override
public void onl oadingStarted(String imageUri, View view) {
holder.imageLoading.setVisibility(View.VISIBLE);
}
@Override
public void onl oadingFailed(String imageUri, View view, FailReason failReason) {
holder.imageLoading.setVisibility(View.GONE);
}
@Override
public void onl oadingComplete(String imageUri, View view, Bitmap loadedImage) {
holder.imageLoading.setVisibility(View.GONE);
}
@Override
public void onl oadingCancelled(String imageUri, View view) {
holder.imageLoading.setVisibility(View.GONE);
}
});
holder.eyeIcon.setImageResource(R.drawable.relive);
}
@Override
public void onl oadingCancelled(String imageUri, View view) {
holder.imageLoading.setVisibility(View.GONE);
}
});
holder.reliveDescription.setText(reliveDescription);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RelivePlayerActivity.StartReliveReviewActivity((ChannelDetailsActivity) holder.itemView.getContext(), relive.asset.stream.url, relive.experienceGuid, relive.guid, holder.getAdapterPosition());
}
});
}
@Override
public final int getItemCount() {
return data.size();
}
final class ViewHolder extends RecyclerView.ViewHolder {
private final CircleImageView profilePicture;
private final ImageView eyeIcon;
private final ImageView backgroundImage;
private final TextView reliveDescription;
private final ProgressBar imageLoading;
ViewHolder(View itemView) {
super(itemView);
profilePicture = (CircleImageView) itemView.findViewById(R.id.profile_circle_image);
eyeIcon = (ImageView) itemView.findViewById(R.id.icon_circle_image);
backgroundImage = (ImageView) itemView.findViewById(R.id.thumbnail_image);
reliveDescription = (TextView) itemView.findViewById(R.id.description_textview);
imageLoading = (ProgressBar) itemView.findViewById(R.id.image_loading);
}
}
}
This is my layout:
activity_ channel_ details
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_details"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#017789"
android:textAlignment="center">
<TextView
android:id="@+id/txt_toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@android:color/white"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="10dp"
android:background="@color/white_trans"
android:src="@drawable/zeality" />
</android.support.v7.widget.Toolbar>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff"
android:orientation="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff"
android:orientation="vertical">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_cover_details"
android:layout_width="match_parent"
android:layout_height="120dp"
android:adjustViewBounds="true"
android:scaleType="fitXY" />
<FrameLayout
android:id="@+id/frame"
android:layout_width="100dp"
android:layout_height="110dp"
android:layout_centerInParent="true">
<co.zeality.vrplayer.views.HexagonImageView
android:id="@+id/img_hex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:scaleType="fitXY" />
</FrameLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_videos"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_relive_details"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
item_ video_ recycle_ tile
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/img_thumbnail_background_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true" />
<FrameLayout
android:id="@+id/frame_image"
android:layout_width="150dp"
android:layout_height="100dp"
android:layout_centerInParent="true">
<ProgressBar
android:id="@+id/pb_video_loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:foregroundGravity="center"
android:visibility="gone" />
<ImageView
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="40dp"
android:src="@drawable/glasses" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_play_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginStart="10dp"
android:src="@drawable/play_no_circle" />
<TextView
android:id="@+id/txt_video_name"
android:layout_width="wrap_content"
android:layout_marginBottom="5dp"
android:layout_height="match_parent"
android:layout_below="@id/img_play_button"
android:layout_marginStart="5dp"
android:textColor="#FFF" />
</RelativeLayout>
</FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_alignParentBottom="true"
android:background="#660c7582"></View>
resolvent:
You should use a recyclerview (vertical) as the parent object, return a view containing recyclerview (horizontal) when the adapter binds the view at position 1, and load other adapters for the recyclerview. Please refer to the figure for correct understanding
Main RecyclerView (vertical):
---------------------------
+ Item 1
---------------------------
+ Second RecyclerView (Horizontal)
---------------------------
+ Item 2
---------------------------
Parent recyclerview adapter code:
@Override
public int getItemViewType(int position) {
if (position == 1)
return 0;
else
return 1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
View v = LayoutInflater.from(context).inflate(R.layout.your_second_recylerView_layout, parent, false);
return new ViewHolder1(v);
}
else{
View v = LayoutInflater.from(context).inflate(R.layout.your_item_layout, parent, false);
return new ViewHolder2(v);
}
}
Now you need to implement a second adapter for the horizontal recycleview