How to get the button in FrameLayout for NavigationDrawer - xamarin

I m new to NavigationDrawer, the code below is working.
But how to get the button inside the homeLayout.axml which is inflated as indicated in HomeFragment.cs after the below code.
ft.Add(Resource.Id.HomeFrameLayout, new HomeFragment());
ft.Commit();
1) I need to add eventHandler to this btn : btnProducts in homeLayout.axml
- where to add below code
what I need to add to setup code to get the btnProducts and add event for this button??
SetContentView (Resource.Layout.????);
Btn = FindViewById<Button>(Resource.Id.BtnGM);
Btn.Click += Btn_Click1;
--- UI:
Main Layout File
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px"
android:fitsSystemWindows="true">
<android.support.v4.widget.DrawerLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px"
android:id="#+id/drawer_layout">
<LinearLayout
android:id="#+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="#layout/app_bar" />
<FrameLayout
android:id="#+id/HomeFrameLayout"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="#+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="#menu/navmenu"
app:headerLayout="#layout/headerdrawerlayout" /> </android.support.v4.widget.DrawerLayout>
</LinearLayout>
-- Code for main UI
public class NaviDrawerActivity : AppCompatActivity
{
private SupportToolbar toolbar;
DrawerLayout drawerLayout;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.NaviDrawer);
drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);
//--- Init toolbar
toolbar = FindViewById<SupportToolbar>(Resource.Id.app_bar);
SetSupportActionBar(toolbar);
SupportActionBar.SetTitle(Resource.String.app_name);
SupportActionBar.SetDisplayHomeAsUpEnabled(true);
SupportActionBar.SetDisplayShowHomeEnabled(true);
//--- Attach item selected handler to navigation view
var navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
navigationView.NavigationItemSelected += NavigationView_NavigationItemSelected;
//-- Create ActionBarDrawerToggle button and add it to the toolbar
var drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, Resource.String.open_drawer, Resource.String.close_drawer);
drawerLayout.SetDrawerListener(drawerToggle);
drawerToggle.SyncState();
//--load default home screen
var ft = FragmentManager.BeginTransaction();
ft.AddToBackStack(null);
ft.Add(Resource.Id.HomeFrameLayout, new HomeFragment());
ft.Commit();
}
//---define custom title text
protected override void OnResume()
{
SupportActionBar.SetTitle(Resource.String.app_name);
base.OnResume();
}
-------------HomeFragment.cs
class HomeFragment: Fragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.Inflate(Resource.Layout.homeLayout, container, false);
return view;
}
}
----------homeLayout.axml
<RelativeLayout 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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#ffffff"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff46a2fd"
android:text="Home"
android:textSize="22dp"
android:textStyle="bold"
android:typeface="sans"
android:gravity="center"
android:layout_gravity="center"
android:layout_centerInParent="true" />
<Button
android:id="#+id/btnProducts"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:layout_marginTop="3dp"
android:background="#307FC1"
android:text="merchant"
android:layout_alignParentBottom="true"
android:textColor="#ffffff" />
</LinearLayout>
</RelativeLayout>

in your HomeFragment.cs in the OnCreateView method add the following (between the declaration of view and the return statment):
var btnProducts = view.FindViewById<Button>(Resource.Id.btnProducts);
btnProducts.Click += btnProducts_Click;
Then add the method for your click event (somewhere in your HomeFragment class):
public void btnProducts_Click(object sender, EventArgs e)
{
// Action you want to take upon button click
}

Related

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

(MapFragment)FragmentManager.FindFragmentById(Resource.Id.map) retuns null always

I am trying to import google map in to my xamarin.android application. I set the key and written code as following `
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Maps);
SetUpMap();
FindViewElements();
}
private void SetUpMap()
{
if (mMap == null)
{
var _mapFragment = FragmentManager.FindFragmentByTag("maptag") as MapFragment;//null
var mapFragment = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.map);//null
// var mapFragment = FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map);//Here are also null
// var _mapFragment = SupportFragmentManager.FindFragmentById(Resource.Id.map) as SupportMapFragment; /null
}
}
protected override async void FindViewElements()
{
_mapsModel = new MapsModel
{
MapsFragment = FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map),
MapTypeSpinner = FindViewById<Spinner>(Resource.Id.spinner),
Toolbar = FindViewById<Toolbar>(Resource.Id.mapToolbar),
};
SetSupportActionBar(_mapsModel.Toolbar);
SupportActionBar.Title = "Maps";
SupportActionBar.SetHomeButtonEnabled(true);
SupportActionBar.SetDisplayHomeAsUpEnabled(true);
_mapsModel.MapsFragment.GetMapAsync(this);
_mapsModel.MapTypeSpinner.ItemSelected += MapTypeSpinner_ItemSelected;
}
I have axml as following
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:id="#+id/header">
<include
android:id="#+id/mapToolbar"
layout="#layout/toolbar" />
</RelativeLayout>
<Spinner
android:id="#+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="#array/maptype_arrays" />
<fragment
android.id="#+id/map"
android:tag="maptag"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
</LinearLayout>
I tried every possible way which I found like replacing Fragment to suppportFragment but nothing got helped. Can any one please suggest me to achieve this.
Thanks in advance
I try your axml, and I get the result as your, so I suggest you can add fragment in FrameLayout, so you can get this fragment by Id. Like this:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="#+id/zoomInButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Zoom In" />
<Button
android:id="#+id/zoomOutButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Zoom Out" />
<Button
android:id="#+id/animateButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Animate to Location" />
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
android:id="#+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
</FrameLayout>
var mapFragment = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.map);
var mapFragment = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.map);
You can also take a look the MSDN document about importing Google map in your project:
https://learn.microsoft.com/en-us/xamarin/android/platform/maps-and-location/maps/maps-api

Xamarin - RecyclerView with PagerSlidingTabStrip - System.NullReferenceException in SetLayoutManager()

I try to use a RecyclerView in a SlideMenu.
I use this example for my SlideMenu : https://github.com/jamesmontemagno/PagerSlidingTabStrip-for-Xamarin.Android
And now, I add RecyclerView with SlideMenu. I need two menu : "menu" and "product", so I use two xml file for my fragment : menu.xml for "menu" and menu_recyclerView.xml for "product".
This is my code :
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true" >
<include
android:id="#+id/top_menu"
layout="#layout/top_menu"/>
<com.refractored.PagerSlidingTabStrip
android:id="#+id/tabs"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:pstsShouldExpand="true"
android:background="#color/Blue"
app:pstsDividerWidth="1dp"
app:pstsDividerPadding="12dp"
app:pstsDividerColor="#50FFFFFF"
android:textColor="#color/Green"
app:pstsTextColorSelected="#color/White"
app:pstsIndicatorColor="#color/Red"
app:pstsUnderlineColor="#color/White"/>
<android.support.v4.view.ViewPager
android:id="#+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
menu_recyclerView.xml
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.CardView
android:id="#+id/menu_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="#+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v7.widget.CardView>
</LinearLayout>
row_recyclerView is a pattern for my items
row_recyclerView.xml
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:paddingRight="15dp"
android:paddingLeft="15dp"
android:orientation="vertical">
<refractored.controls.CircleImageView
android:id="#+id/imageView"
app:civ_border_width="2dp"
app:civ_border_color="#000000"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="88"
android:orientation="vertical"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="7dp"
android:paddingBottom="7dp">
<TextView
android:text="Name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtName"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="18sp" />
<TextView
android:text="Brand"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtBrand"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="14sp"
android:singleLine="true" />
<TextView
android:text="Description"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtDescription"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
-
public class MainActivity : BaseActivity
{
protected override int LayoutResource
{
get
{
return Resource.Layout.Main;
}
}
private Android.Widget.Toolbar _topMenu;
private Adapter _adapter;
private ViewPager _pager;
private PagerSlidingTabStrip _tabs;
private RecyclerView _recyclerView;
private LayoutManager _layoutManager;
public string _tag = "MainActivity";
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
_recyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView);
_layoutManager = new LayoutManager(this, _recyclerView);
_layoutManager.addItem("one", "two", "three");
_layoutManager.addItem("one", "two", "three");
_layoutManager.createLayoutManager();
_adapter = new Adapter(SupportFragmentManager);
_pager = FindViewById<ViewPager>(Resource.Id.pager);
_tabs = FindViewById<PagerSlidingTabStrip>(Resource.Id.tabs);
_pager.Adapter = _adapter;
_tabs.SetViewPager(_pager);
_topMenu = FindViewById<Android.Widget.Toolbar>(Resource.Id.top_menu);
SetActionBar(_topMenu);
}
-
class LayoutManager
{
public RecyclerView _mRecyclerView;
public RecyclerView.LayoutManager _mLayoutManager;
public RecyclerView.Adapter _mAdapter;
public ItemList<Item> _mItems;
public Activity _main;
public LayoutManager(Activity main, RecyclerView recyclerView)
{
_main = main;
_mRecyclerView = recyclerView;
_mItems = new ItemList<Item>();
}
public void createLayoutManager()
{
_mLayoutManager = new LinearLayoutManager(_main);
_mRecyclerView.SetLayoutManager(_mLayoutManager);
_mAdapter = new RecyclerAdapter(_mItems, _mRecyclerView);
_mItems.Adapter = _mAdapter;
_mRecyclerView.SetAdapter(_mAdapter);
}
public void addItem(string name, string brand, string description)
{
_mItems.Add(new Item()
{
Img = Resource.Drawable.Icon,
Name = name,
Brand = brand,
Desciption = description
});
}
}
And in this line (in my LayoutManager.cs):
_mRecyclerView.SetLayoutManager(_mLayoutManager);
I have This error :
System.NullReferenceException: Object reference not set to an instance of an object.
I do not understand what is the value of the probleme ?
I forget any thing ?
I am completely lost ?
Please.. help !
Thanks you,
Romain
According to your code: public class MainActivity : BaseActivity and
protected override int LayoutResource
{
get
{
return Resource.Layout.Main;
}
}
I guess that your BaseActivity is the same as BaseActivity.cs of PagerSlidingTabStrip sample.
Then you actually here set your Main.xml as the content view of your MainActivity, and in this Main.xml, there is no RecyclerView with the id recyclerView, it is in your menu_recyclerView.xml. Although you can find the id recyclerView when you coding, but it is not present on the content view.
So in your MainActivity, when you try to find it using _recyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView);, this _recyclerView here should be null when you run your code. Then of course when you call _layoutManager = new LayoutManager(this, _recyclerView);, you pass a null to this LayoutManager. You can insert a break point on this line to check if it is a null:
_recyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView);
To solve your issue, I think you may need to redesign your layout or your frame.
Thanks for your answer !
Yes my BaseActivity il the same as BaseActivity.cs of PagerSlidingTabStrip sample.
I follow your advice, and yes I have a probleme with my architecture.
I learn how it works the RecyclerView, and I add this :
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true" >
<include
android:id="#+id/top_menu"
layout="#layout/top_menu"/>
<com.refractored.PagerSlidingTabStrip
android:id="#+id/tabs"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:pstsShouldExpand="true"
android:background="#color/Blue"
app:pstsDividerWidth="1dp"
app:pstsDividerPadding="12dp"
app:pstsDividerColor="#50FFFFFF"
android:textColor="#color/Green"
app:pstsTextColorSelected="#color/White"
app:pstsIndicatorColor="#color/Red"
app:pstsUnderlineColor="#color/White"/>
<android.support.v4.view.ViewPager
android:id="#+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<include
layout="#layout/recyclerView" />
</LinearLayout>
menu_recyclerView.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:paddingRight="15dp"
android:paddingLeft="15dp"
android:orientation="vertical">
<refractored.controls.CircleImageView
android:id="#+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:civ_border_width="2dp"
app:civ_border_color="#000000"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="88"
android:orientation="vertical"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="7dp"
android:paddingBottom="7dp">
<TextView
android:text="Name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtName"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="18sp" />
<TextView
android:text="Brand"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtBrand"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="14sp"
android:singleLine="true" />
<TextView
android:text="Description"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/txtDescription"
android:textColor="#000"
android:gravity="center_vertical"
android:padding="2dp"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
I add the new xml file : recyclerView.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v7.widget.RecyclerView
android:id="#+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</android.support.v7.widget.CardView>
Now I call recyclerView.xml in my Main.xml. recyclerView.xml contain CardView, and he wrap RecyclerView.
I should put my RecyclerView in a only CardView or I should to wrap my menu_recyclerView.xml with cardView ?
I want to create a menu like this :
I have a result, but now I think I have a probleme with my menu_recyclerView.xml because I don't have a list, juste "name, brand, description". screenshot :
I search for this, and is a another subject...
I think the good keyword for this probleme is : RecyclerView, CardView
for finish this is my other sources :
https://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156
How to add listView inside cardView android?
How to implement RecyclerView with CardView rows in a Fragment with TabLayout
Thanks a lot,

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.

Contextual custom card cannot dismiss - android wear

Android wear app for Custom notification.By a button click it will notify.But its just showing only a black screen inside card frame,also can't dismiss by left to right swipe.Do i need to add any additional codes to make the card dismissal.
MainActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
#Override
public void onLayoutInflated(WatchViewStub stub) {
speakButton= (Button) findViewById(R.id.speakButton);
speakButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
postNotif();
}
});
}
});
}
private void postNotif(){
int notificationId=001;
Intent notificationIntent = new Intent(this, NotificationActivity.class);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(this, 0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder notificationBuilder =
new Notification.Builder(this)
.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher)
.extend(new Notification.WearableExtender()
.setStartScrollBottom(false)
.setHintHideIcon(true)
.setDisplayIntent(notificationPendingIntent));
NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(notificationId,notificationBuilder.build());
}
NotificationActivity.class
public class NotificationActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_result_card);
}
}
search_result_card.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.BoxInsetLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:background="#00ffffff"
android:id="#+id/fragment_container"
android:layout_width="match_parent">
<android.support.wearable.view.CardScrollView
android:id="#+id/card_scroll_view"
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.wearable.view.CardFrame
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="bottom"
android:id="#+id/card_frame"
android:alpha=".9">
<TextView
android:layout_height="match_parent"
android:layout_width="fill_parent"
android:text="Bnp Paribas"
android:textColor="#color/black"
android:textSize="18sp"
android:id="#+id/security_label"
android:alpha=".7" />
<TextView
android:fontFamily="sans-serif-light"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:text="45.99"
android:id="#+id/security_rate"
android:textColor="#color/black"
android:textSize="16sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:fontFamily="sans-serif-light"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="▲ +1,21%"
android:textColor="#color/black"
android:layout_gravity="left|bottom"
android:textSize="14sp"
android:id="#+id/performance_percent"/>
<TextView
android:fontFamily="sans-serif-light"
android:layout_height="wrap_content"
android:layout_width="56dp"
android:text="+1,76 €"
android:id="#+id/perf_value"
android:textColor="#color/black"
android:layout_marginLeft="15dp"
android:textSize="14sp"
android:layout_gravity="right|bottom" />
</LinearLayout>
</android.support.wearable.view.CardFrame>
</android.support.wearable.view.CardScrollView>
</android.support.wearable.view.BoxInsetLayout>
AndroidManifest.xml
<activity android:name=".NotificationActivity"
android:exported="true"
android:allowEmbedded="true"
android:taskAffinity=""
android:theme="#android:style/Theme.DeviceDefault.Light" />

Resources