Capture checkbox event in the recyclerview - xamarin

I have MainViewModel where it shows all the person as a list using recyclerview. Each person has age, gender, name property and also checkbox in order to delete it.
I could not able to figure out how I could able to capture user checkbox event in the MainViewModel?
MainView.axml
<CheckBox
android:id="#+id/checkbox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
local:MvxBind="Checked IsAllSelected" />
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Name"
android:layout_weight="1" />
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Age" />
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Gender" />
</LinearLayout>
<MvxRecyclerView
android:id="#+id/personRecyclerView"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
local:MvxItemTemplate="#layout/persontemplate"
local:MvxBind="ItemsSource Items; ItemClick ItemSelected" />
</LinearLayout>
PersonTemplate.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_height="60dp">
<CheckBox
android:id="#+id/chked"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
local:MvxBind="Checked IsSelected; Click CheckBoxSelectionCommand;" />
<TextView
android:id="#+id/Name"
android:layout_width="0dp"
android:layout_height="wrap_content"
local:MvxBind="Text Name"
android:layout_weight="1" />
<TextView
android:id="#+id/Age"
android:layout_width="0dp"
android:layout_height="wrap_content"
local:MvxBind="Text Age"
android:layout_weight="1" />
<TextView
android:id="#+id/Gender"
android:layout_width="0dp"
android:layout_height="wrap_content"
local:MvxBind="Text Gender
android:layout_weight="1" />
</LinearLayout>
I am trying to update IsDeleteBtnShow based on the checkbox selection for each item.
MainViewModel.cs
public bool IsAllSelected
{
get { return _isAllSelected; }
set
{
_isAllSelected= value;
Items.ForEach(x => x.IsSelected = _isAllSelected);
IsDeleteBtnShow = _isAllSelected;
RaisePropertyChanged(() => IsAllSelected);
}
}
I have the following viewmodel which is used by RecyclerView to tabulate person as a list.
PersonRecyclerViewModel.cs
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
RaisePropertyChanged(() => IsSelected);
}
}
public ICommand CheckBoxSelectionCommand
{
get
{
return new MvxCommand(() =>
{
var isChecked = IsSelected;
});
}
}
public static PersonViewModel CreateViewModel(Person person)
{
return new PersonViewModel
{
IsSelected = person.IsSelected,
Age= person.Age,
Gender= person.Gender,
Name= entity.Name,
};
}

You can just pass a callback or command to the cration of the ItemViewModel. CreateViewModel(Person person, Action<PersonViewModel> checkboxSelectedCallback) and use it directly as or in CheckBoxSelectionCommand. Something like this:
CheckBoxSelectionCommand
public ICommand CheckBoxSelectionCommand
{
get
{
return new MvxCommand(() =>
{
var isChecked = IsSelected;
ParentCheckBoxSelectionCallback(this);
});
}
}
CreateViewModel
public static PersonViewModel CreateViewModel(Person person, Action<PersonViewModel> checkboxSelectedCallback)
{
return new PersonViewModel
{
IsSelected = entity.IsSelected,
Age = entity.Age,
ParentCheckBoxSelectionCallback = checkboxSelectedCallback,
Gender= entity.Gender,
Name= entity.Name,
};
}
MainViewModel
// only create once.
_checkedChangedCallback = (person =>
{
// do what you have to do if a item got selected
});
// where you create persons
CreateViewModel(person, _checkedChangedCallback );

Another way to do this without adding Actions or any logic in your model is to make your model implement INotifyPropertyChanged:
class PersonRecyclerViewModel : INotifyPropertyChanged
The quickest way to do it is using Fody PropertyChanged because you´ll get the whole implementation of the interface by just adding an attribute to the model:
[ImplementPropertyChanged]
class PersonRecyclerViewModel {}
In your ViewModel, when you get or refresh data source, a for loop would listen for item property changes:
foreach(var item in Items)
{
var n = (INotifyPropertyChanged)item;
n.PropertyChanged += OnItemPropertyChanged;
}
private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
if(propertyChangedEventArgs.PropertyName == "IsSelected")
{
// do whatever you need here
}
}

Related

What property do you use to bind data to axml layout in MvvmLight?

I've been for two whole days trying to figure out how do you bind data and commands to layout elements like a button or a listView and up until now I have had no success heres what I have as an example of one of my layouts.
Can you Help me?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<android.support.v4.widget.SwipeRefreshLayout
android:id="#+id/srlStores"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="80"
local:MvxBind="Refreshing IsBusy">
<MvxListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/lvStores"
local:MvxBind="ItemsSource Stores; ItemClick OpenDetailCommand"
local:MvxItemTemplate="#layout/store_list_item" />
</android.support.v4.widget.SwipeRefreshLayout>
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="20"
android:id="#+id/progressBar1"
local:MvxBind="Visible IsBusy" />
<Button
android:text="#string/storeListCreateButtonText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/bCreate"
android:layout_weight="20"
local:MvxBind="Click CreateCommand" />
</LinearLayout>
You are extremely close. You have to make sure the ViewModel is setup properly, and then just go into the ViewModel that is associated with that Fragment which this Layout belongs to and for the button add this:
private IMvxCommand _createCommand;
public IMvxCommand CreateCommand
{
get
{
return createCommand ?? (createCommand = new MvxCommand(() =>
{
// Do Some Work
}));
}
}
Similarly for your List, you need to create an ObservableCollection like this:
private ObservableCollection<StoreListModelWrapper> _stores;
public ObservableCollection<StoreListModelWrapper> Stores
{
get { return _stores; }
set { SetProperty(ref _stores, value); }
}
that will be called using the click command
public IMvxCommand<StoreListModelWrapper> _itemClickCommand;
public IMvxCommand<StoreListModelWrapper> ItemClickCommand
{
get
{
return _itemClickCommand ?? (_itemClickCommand = new MvxCommand<StoreListModelWrapper>((item) => // Do Work with item.
));
}
}

xamarin andriod popupwindow custom listview itemclick event not working

list.ItemClick+= not working. How I can perform item click on popup window custom listview? In simple listview the itemclick event works, but in the popup window the event is not fired. I need to get the listview item value.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="500dp"
android:gravity="center"
android:descendantFocusability="blocksDescendants"
android:layout_height="wrap_content"
android:background="#android:color/background_light"
android:weightSum="100">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_weight="10"
android:layout_height="40dp">
<TextView
android:text="Vælg din afdeling"
android:textSize="20sp"
android:textColor="#FF222222"
android:paddingLeft="30dp"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="25px"
android:minHeight="25px"
android:id="#+id/textView1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="10">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_weight="50">
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/listView1" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="35dp">
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:id="#+id/btnAddExpense"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:textColor="#61222222"
android:background="#null"
android:text="Annuller"
android:layout_marginLeft="20dp"
android:layout_gravity="right"
android:layout_marginRight="15dp" />
<Button
android:id="#+id/btnok"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:textColor="#FFF62F5E"
android:text="Gem"
android:background="#null"
android:layout_marginLeft="1dp"
android:layout_gravity="right"
android:layout_marginRight="15dp" />
</LinearLayout>
</LinearLayout>
In this function, I set item click event on listview but it is not working. How can I perform itemclick?
private void DepartmentPicker_Click(object sender, EventArgs e)
{
ButtonNext.Visibility = ViewStates.Invisible;
GetListView.Adapter = new DepartmentListAdapter(this, departments);
bool focusable = true;
int width = 350;// LinearLayout.LayoutParams.WrapContent;
int height = 450;//LinearLayout.LayoutParams.WrapContent;
_view.FindViewById<Button>(Resource.Id.btnok).SetOnClickListener(this);
var list= _view.FindViewById<ListView>(Resource.Id.listView1);
popupWindow = new PopupWindow(_view, width, height, focusable);
popupWindow.ContentView = _view;
popupWindow.ShowAtLocation(_view, GravityFlags.CenterVertical, 0, 0);
popupWindow.Focusable = true;
popupWindow.Touchable = true;
//listView.ChoiceMode = ChoiceMode.Single;
}
I wrote a demo about it, this is running GIF.
There is my code of MainActivity.cs
public class MainActivity : AppCompatActivity
{
List<News> data;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
Button button1 = FindViewById<Button>(Resource.Id.button1);
button1.Click += (o, e) =>
{
var popup = OnClick();
popup.ShowAsDropDown((View)o, 0, 0);
};
data = new List<News>() {
new News ("aaaaaaaa",1200),
new News ("bbbbbbbbb",560),
new News ("ccccccccc",158200),
new News ("ddddddddd",900),
};
// adapter = new NewsAdapter(data, this);
}
private PopupWindow OnClick()
{
PopupWindow _popupWindow = new PopupWindow(this);
LayoutInflater inflater= (LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
View popup=inflater.Inflate(Resource.Layout.window_popup_content,null);
ListView listView1 = popup.FindViewById<ListView>(Resource.Id.listView1);
NewsAdapter adapter = new NewsAdapter(data, this);
listView1.Adapter = adapter;
listView1.ItemClick += (sender, args) =>
{
Toast.MakeText(this, data[args.Position].Title + "", ToastLength.Short).Show();
_popupWindow.Dismiss();
};
_popupWindow.Width = ViewGroup.LayoutParams.WrapContent;
_popupWindow.Height = ViewGroup.LayoutParams.WrapContent;
_popupWindow.ContentView = popup;
return _popupWindow;
}
}
There is adapter of listview.
public class NewsAdapter : BaseAdapter
{
private List<News> data;
private Context context;
public override int Count
{
get
{
return data.Count;
}
}
public NewsAdapter(List<News> data, Context context)
{
this.data = data;
this.context = context;
}
public override Java.Lang.Object GetItem(int position)
{
return null;
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test, parent, false);
TextView title = convertView.FindViewById<TextView>(Resource.Id.tv_title);
TextView pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);
pv.Text = data[position].Pv.ToString();
title.Text = data[position].Title;
return convertView;
}
xaml of ListviewItem
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
>
<LinearLayout
android:id="#+id/layout_content"
android:layout_width="match_parent"
android:layout_height="30dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="#+id/tv_title"
android:layout_height="20dp"
android:layout_width="0dp"
android:layout_weight="5"
android:textColor="#000000"
android:text="aaaaaaaaa"
android:textSize="16dp" />
<TextView
android:id="#+id/tv_pv"
android:layout_height="10dp"
android:layout_width="0dp"
android:layout_weight="1"
android:textColor="#808080"
android:textSize="10dp"
android:text="19665"
android:gravity="right|center_vertical" />
</LinearLayout>
<View
android:layout_height="1dp"
android:layout_width="match_parent"
android:background="#dedede" />
</LinearLayout>
There is my demo. you could refer to it.
https://github.com/851265601/ListviewPopUpWindowDemo

MvvmCross 6 RecyclerView multiple buttons item binding

I'm really new in Xamarin & more in MvvmCross. For the moment, I succeeded doing some basic stuff.
But now, I'm facing a simple problem (for me). I got an MvxRecyclerView. Each of its items has 2 buttons. How can I bind them?
Given your ViewModels:
public class MyViewModel : MvxViewModel
{
public MyViewModel()
{
this.MyItems.Add(new MyItemViewModel());
this.MyItems.Add(new MyItemViewModel());
}
public ObservableCollection<MyItemViewModel> MyItems { get; set; } = new ObservableCollection<MyItemViewModel>();
}
public class MyItemViewModel : MvxNotifyPropertyChanged
{
public MyItemViewModel()
{
// Initialize your commands
}
public ICommand MyCommand1 { get; set; }
public ICommand MyCommand2 { get; set; }
}
In your view:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<mvvmcross.droid.support.v7.recyclerview.MvxRecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
local:MvxItemTemplate="#layout/item_test"
local:MvxBind="ItemsSource MyItems" />
</LinearLayout>
In your item view item_test.axml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="My button 1"
local:MvxBind="Click MyCommand1" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="My button 2"
local:MvxBind="Click MyCommand2" />
</LinearLayout>
HIH

Radio button inside listView is not triggering in Xamarin.Android

I have declared a listView like this :
<Mvx.MvxListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/listview"
local:MvxBind="ItemsSource QuestionList; ItemClick ButtonClick"
local:MvxItemTemplate="#layout/item_questions"
android:clickable="true"
android:layout_margin="10dp"
android:layout_marginBottom="20dp" />
Now my item template contains choice mode questions which is rendering as per the requirement but whenever i click on any radio button its not triggering any event. I have take all the selected values from the radio button.
Below is my code of item template:
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/radioButton1"
android:textColor="#000000"
android:clickable="true"
local:MvxBind="Text OptionA; Click ItemChecked" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
local:MvxBind="Text OptionB; Click ItemChecked"
android:id="#+id/radioButton2" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
local:MvxBind="Text OptionC; Click ItemChecked"
android:id="#+id/radioButton3" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
local:MvxBind="Text OptionD; Click ItemChecked"
android:id="#+id/radioButton4" />
</RadioGroup>
I also implemented the wrapper class as suggested. Below is my wrapper class code:
public class ListViewWrapper
{
Question _question;
QuestionsViewModel _parent;
public ListViewWrapper()
{
}
public ListViewWrapper(Question radio, QuestionsViewModel parent)
{
_question = radio;
_parent = parent;
}
public IMvxCommand ItemChecked
{
get
{
return new MvxCommand(() => _parent.btnClick(_question));
}
}
public Question Item
{
get
{
return _question;
}
}
}
Here's ViewModel :
private IMvxCommand _buttonClick;
public IMvxCommand ButtonClick
{
get
{
_buttonClick = _buttonClick ?? new MvxCommand<Question>(btnClick);
return _buttonClick;
}
}
public void btnClick(Question item)
{
//Do something
}

Horizontal RecyclerViews inside vertical RecyclerView scrolling jerks

I am using a layout in which I used multiple RecyclerViews (Horizontal) as a item view of RecyclerView. The problem is that the vertical scrolling is not as smooth as I am expecting.There are some jerks in while scrolling vertically(Parent RecyclerView).
How to remove these vertical scrolling jerks ? I used to set adapters to horizontal RecyclerViews in OnBindViewHolder() method of Parent RecyclerView.
I have solved the problem.
Scrolling performance is much better in this case.
Do not set adapters to horizontal RecyclerViews in OnBindViewHolder() method of Parent RecyclerView.
Instead of it set it at very first time when the view is created via onCreateViewHolder() of RecyclerView with empty or null dataList.
Just replace the new secondary data list with previous null list at onBindViewHolder() and call notifydataSetChanged() to HorizontalAdapetr.
This is much better than setAdapter() in onBindViewHolder().
You can try this way
main activity
public void initialize(List<List<ResponseObject>> responseObjectList) {
RecyclerView upperRecyclerView = (RecyclerView) this.findViewById(R.id.main_layout);
upperRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
VerticalAdapter adapter = new VerticalAdapter(this, responseObjectLists);
upperRecyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
Vertical recycled view adapter
public class VerticalAdapter extends RecyclerView.Adapter<VerticalAdapter.Holder> {
final private SearchActivity activity;
List<List<ResponseObject>> list;
public VerticalAdapter(SearchActivity activity, List<List<ResponseObject>> lists) {
this.list = lists;
this.activity = activity;
}
public Holder onCreateViewHolder(ViewGroup parent,int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.vertical_layout, null);
return new Holder(itemLayoutView);
}
public void onBindViewHolder(Holder viewHolder, int position) {
List<ResponseObject> objectList = list.get(position);
viewHolder.packageTitle.setText(objectList.get(0).getTag());
ImageAdapter imageAdapter = new ImageAdapter(activity, objectList);
viewHolder.horizontalRecyclerView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false));
viewHolder.horizontalRecyclerView.setAdapter(imageAdapter);
viewHolder.horizontalRecyclerView.setNestedScrollingEnabled(false);
imageAdapter.notifyDataSetChanged();
}
public final static class Holder extends RecyclerView.ViewHolder {
protected TextView packageTitle;
protected RecyclerView horizontalRecyclerView;
public Holder(View view) {
super(view);
this.packageTitle = (TextView) view.findViewById(R.id.recycleViewTitle);
this.horizontalRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
this.horizontalRecyclerView.setLayoutManager(new LinearLayoutManager(this.horizontalRecyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
this.horizontalRecyclerView.setNestedScrollingEnabled(false);
horizontalRecyclerView.setAdapter(null);
}
}
public int getItemCount() {
return ListUtil.isEmpty(list) ? 0 : list.size();
}
}
Horizontal recycleview adapter
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {
private List<ResponseObject> mainPageResponseList;
private SearchActivity activity;
public ImageAdapter(SearchActivity activity, List mainPageResponseList) {
this.mainPageResponseList = mainPageResponseList;
this.activity = activity;
}
public ImageAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.horizontal_layout_view, null);
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
public void onBindViewHolder(ViewHolder viewHolder, int position) {
ResponseObject object = mainPageResponseList.get(position);
Util.setImageUsingGlide(object.getImage(), viewHolder.imageView);
viewHolder.packageName.setText(object.getDestination());
viewHolder.packagePrice.setText(object.getPrice() + "");
viewHolder.imageView.setOnClickListener(null);
}
public final static class ViewHolder extends RecyclerView.ViewHolder {
protected ImageView imageView;
protected TextView packageName;
protected TextView packagePrice;
public ViewHolder(View view) {
super(view);
this.imageView = (ImageView) view.findViewById(R.id.packageImage);
this.packageName = (TextView) view.findViewById(R.id.packageName);
this.packagePrice = (TextView) view.findViewById(R.id.packagePrice);
}
}
public int getItemCount() {
return ListUtil.isEmpty(mainPageResponseList) ? 0 : mainPageResponseList.size();
}
}
main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="#+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#color/white"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="#+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="#style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="#+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="visible">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="#+id/ivHolidayMainImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
app:layout_collapseMode="parallax" />
<ImageView
android:id="#+id/ivHotelImage"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_alignTop="#id/ivHolidayMainImage"
android:background="#drawable/gradient_from_up_hotel_image" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="250dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true">
<TextView
android:id="#+id/mainPackageTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Popular Pick"
android:textColor="#color/white"
android:textSize="12dp" />
<TextView
android:id="#+id/mainPackageName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/mainPackageTitle"
android:text="Andaman Islands"
android:textColor="#color/white"
android:textSize="18dp" />
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginLeft="50dp"
android:layout_marginRight="10dp">
<TextView
android:id="#+id/mainPackagePrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="25000"
android:textColor="#color/white"
android:textSize="18dp" />
<TextView
android:id="#+id/journeyType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/mainPackagePrice"
android:text="Popular Pick"
android:textColor="#color/white"
android:textSize="12dp" />
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="-100dp"
android:background="#drawable/gradient_from_down_hotel_image" />
</app.viaindia.views.ViaLinearLayout>
<android.support.v7.widget.Toolbar
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="#style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="#+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="#string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:src="#drawable/ic_sms_black"
app:layout_anchor="#id/appbar"
app:layout_anchorGravity="bottom|right|end" />
vertical_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp">
<TextView
android:id="#+id/recycleViewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Beaches"
android:textColor="#color/black_light"
android:textSize="20dp" />
<android.support.v7.widget.RecyclerView
android:id="#+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="160dp"
android:layout_gravity="center"
app:layout_behavior="#string/appbar_scrolling_view_behavior" />
holizontal_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:viaCustom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="#+id/packageImage"
android:layout_width="wrap_content"
android:layout_height="230dp"
android:scaleType="fitXY"
android:src="#drawable/cheese_1" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="160dp">
<TextView
android:id="#+id/tvNightAndDays"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="3 Night/4 days"
android:textColor="#color/white" />
</RelativeLayout>
</RelativeLayout>
Try to notifydatasetChanged() in onbindViewHolder() not setAdapter(). SetAdapter() is more time consuming than notifying datset change.

Resources