Hi everyone 👋 I have been developing Android Apps since 2010, and I'm very interested in UI/UX. I also share information through blog and Github.
- Facebook 📸
- X 𝕏
- LinkedIn 🧑💻
- Kmshack®™ website 🌐
- Kmshack®™ blog 🌐
DEPRECATED
License: Apache License 2.0
Hi everyone 👋 I have been developing Android Apps since 2010, and I'm very interested in UI/UX. I also share information through blog and Github.
Hello Guys
The scroll is not working when i try to do it from the PagerSlidingTabStrip view.. How can i fix that?
Thanks in advance
Inside SampleListFragment you are adding a blank header what if we want to use a GridView or scrollView rather than ListView and in adjustScroll we can setSelectionFromTop in listView or setScroll in ScrollView but what about GridView ( setSelection is not working perfectly )?
How can we achieve that without setting a blank header.
SwipeRefreshLayout is invisible, the swipe is work, onRefresh event is called, but the progress bar is invisible
Lots of errors when i try to build it.I think you must provide at least runnable code here
Hi , this demo working perfectly but i want to set dynamic images in header , i am getting URL from server so after downloading image from Server i need to set it in header .Please let me know how it will work .
Will this work properly if the row elements in the listview are of different sizes?
The way getScrollY (on the basis of which Header is animated) is implemented, it looks as though scrolling will be smooth only if all elements are of equal size. Kindly correct me if I am wrong.
public int getScrollY(AbsListView view) {
View c = view.getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = view.getFirstVisiblePosition();
int top = c.getTop();
int headerHeight = 0;
if (firstVisiblePosition >= 1) {
headerHeight = mHeaderHeight;
}
return -top + firstVisiblePosition * c.getHeight() + headerHeight;
}
Hello,
In your sample app you have kept the header size fixed.
As per my app's requirement i cannot keep it fixed.
I tried by changing the Header-FrameLayout and FakeHeader-FrameLayout to WrapContent. But it does not work. The Header gets fixed and does not scroll with the ListView.
Can you please help me??
http://www.dailymotion.com/dm_5233001e62925 can someone pls tell me how can i achieve this type of video effect in android using this lib i m using tabs+viewpager for each tab there will be listview and gridview
The ViewPager in my app contains layouts with ListViews, ExpandableListViews, ScrollView, RelativeLayout and LinearLayout(with a MapFragment in this).
Everything works fine for Tabs containing ListViews and ExpandableListViews! But.. not for the other layouts? How to proceed now?
Please Help me I'm trying to build an app for our college Festival.
Thanks!
Can you post an example with ScrollView or with the new RecycleView class? Thanks
Hello, is it possible to use the library StickyListHeader (https://github.com/emilsjolander/StickyListHeaders) in your library?
I managed to use it correctly, but the headers do not stay below the ViewPager
Do you have a solution?
Sorry for my bad English I'm a french developer :)
as title. finally resolved by adding transparent layout to listview.
15921-15921/com.kmshack.newstand E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.kmshack.newstand, PID: 15921
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kmshack.newstand/com.kmshack.newsstand.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setAlpha(float)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setAlpha(float)' on a null object reference
at com.nineoldandroids.view.ViewHelper$Honeycomb.setAlpha(ViewHelper.java:185)
at com.nineoldandroids.view.ViewHelper.setAlpha(ViewHelper.java:19)
at com.kmshack.newsstand.MainActivity.onCreate(MainActivity.java:78)
at android.app.Activity.performCreate(Activity.java:5953)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Can you please look at this question posted on SO:
http://stackoverflow.com/questions/30955781/google-news-stand-like-listviews-in-viewpager-on-tab
Is there any easy way to achieve this
Is there any way to get it working with the new appcompat support library? They introduced many changes on it and I don't find how to solve the problem of getActionBarIconView() always returning null.
I am using the same logic but getActionBarIcon() returns null. Actually android.R.id.home as a imageview is returning null.
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private ImageView getActionBarIconView() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return (ImageView) findViewById(android.R.id.home);
}
return (ImageView) findViewById(android.support.v7.appcompat.R.id.home);
}
Help me please!!!!
How to integrate ParallaxHeaderViewPager into swiperefreshlayout
Title says it all.
Thanks
Hi
how can I do set setCurrentItem function?
after below code I get some errors :
mViewPager.setCurrentItem(3);
errors :
at com.kmshack.newsstand.MainActivity.onPageSelected(MainActivity.java:145)
at com.astuetz.PagerSlidingTabStrip$PageListener.onPageSelected(PagerSlidingTabStrip.java:387)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:548)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
at com.kmshack.newsstand.MainActivity.onCreate(MainActivity.java:126)//mViewPager.setCurrentItem(3);
I want to use different layout in different tabs. How to do that?
After leaving the app in the background for a long while, you will get a crash when changing tab and and the header wont scroll...
if the content of viewpager is little,can add some moving animation with header
maybe it is by design but the lists scroll position resets when changing tab
Hi
I would like to use this library in android studio.
after run it, I get this error :
03-23 22:57:12.966 13408-13408/com.kmshack.newsstand E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kmshack.newsstand/com.kmshack.newsstand.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
at android.app.ActivityThread.access$700(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5328)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.nineoldandroids.view.ViewHelper$Honeycomb.setAlpha(ViewHelper.java:185)
at com.nineoldandroids.view.ViewHelper.setAlpha(ViewHelper.java:19)
at com.kmshack.newsstand.MainActivity.onCreate(MainActivity.java:79)
at android.app.Activity.performCreate(Activity.java:5250)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
at android.app.ActivityThread.access$700(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5328)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
I was having some problems implementing this because of it losing scroll position and not maintaining header size across tabs when I tried to get the scroll position working.
This is my solution:
A way you can hack it to make it remember scroll position as well as keep track of the header state across all tabs.
Not the best solution but might give someone some ideas:
SampleListFragment:
package com.kmshack.newsstand;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class SampleListFragment extends ScrollTabHolderFragment implements OnScrollListener {
private static final String ARG_POSITION = "position";
Map<String, String> map = new HashMap<String, String>();
int scrollh;
private ListView mListView;
private ArrayList mListItems;
private int mPosition;
private int index = -1;
private int top = 0;
int sheight;
int mMinHeaderHeight;
int mHeaderHeight;
public static Fragment newInstance(int position) {
SampleListFragment f = new SampleListFragment();
Bundle b = new Bundle();
b.putInt(ARG_POSITION, position);
f.setArguments(b);
return f;
}
@OverRide
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPosition = getArguments().getInt(ARG_POSITION);
mListItems = new ArrayList<String>();
for (int i = 1; i <= 100; i++) {
mListItems.add(i + ". item - currnet page: " + (mPosition + 1));
}
}
@OverRide
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_list, null);
mListView = (ListView) v.findViewById(R.id.listView);
mMinHeaderHeight = getResources().getDimensionPixelSize(R.dimen.min_header_height);
mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.header_height);
View placeHolderView = inflater.inflate(R.layout.view_header_placeholder, mListView, false);
mListView.addHeaderView(placeHolderView);
return v;
}
@OverRide
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mListView.setOnScrollListener(this);
mListView.setAdapter(new ArrayAdapter<String>(getActivity(), R.layout.list_item, android.R.id.text1, mListItems));
}
@OverRide
public void onResume() {
super.onResume();
if(index!=-1){
//mListView.setSelectionFromTop(index, top);
}
// if(MainActivity.getscrollh()==288){
//int nin =Integer.parseInt( map.get(""+mPosition+"n"+index));
//mListView.setSelectionFromTop(nin, -mMinHeaderHeight+200);
//mListView.setSelectionFromTop(nin, 1);
//}
}
@OverRide
public void onPause() {
super.onPause();
try{
index = mListView.getFirstVisiblePosition();
View v = mListView.getChildAt(0);
top = (v == null) ? 0 : v.getTop();
map.put(""+mPosition+"n"+index, ""+index);
}
catch(Throwable t){
t.printStackTrace();
}
}
@OverRide
public void adjustScroll(int scrollHeight) {
scrollh=scrollHeight;
MainActivity.setscrollh(scrollHeight);
if (scrollHeight == 0 && mListView.getFirstVisiblePosition() >= 0) {
return;
}
if(MainActivity.getscrollh()==288){
int nin =Integer.parseInt( map.get(""+mPosition+"n"+index));
mListView.setSelectionFromTop(nin, -mMinHeaderHeight+90);
}else{
mListView.setSelectionFromTop(1, scrollHeight);
}
}
@OverRide
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (mScrollTabHolder != null)
mScrollTabHolder.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount, mPosition);
try{
index = mListView.getFirstVisiblePosition();
View v = mListView.getChildAt(0);
top = (v == null) ? 0 : v.getTop();
map.put(""+mPosition+"n"+index, ""+index);
}
catch(Throwable t){
t.printStackTrace();
}
}
@OverRide
public void onScrollStateChanged(AbsListView view, int scrollState) {
// nothing
}
}
MainActivity:
package com.kmshack.newsstand;
import android.annotation.TargetApi;
import android.graphics.RectF;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.util.SparseArrayCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.text.Spannable;
import android.text.SpannableString;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AbsListView;
import android.widget.ImageView;
import com.astuetz.PagerSlidingTabStrip;
import com.flavienlaurent.notboringactionbar.AlphaForegroundColorSpan;
import com.flavienlaurent.notboringactionbar.KenBurnsSupportView;
import com.nineoldandroids.view.ViewHelper;
public class MainActivity extends ActionBarActivity implements ScrollTabHolder, ViewPager.OnPageChangeListener {
static int scrollh;
private static AccelerateDecelerateInterpolator sSmoothInterpolator = new AccelerateDecelerateInterpolator();
private KenBurnsSupportView mHeaderPicture;
private View mHeader;
private PagerSlidingTabStrip mPagerSlidingTabStrip;
private ViewPager mViewPager;
private PagerAdapter mPagerAdapter;
private int mActionBarHeight;
private int mMinHeaderHeight;
private int mHeaderHeight;
private int mMinHeaderTranslation;
private ImageView mHeaderLogo;
private RectF mRect1 = new RectF();
private RectF mRect2 = new RectF();
private TypedValue mTypedValue = new TypedValue();
private SpannableString mSpannableString;
private AlphaForegroundColorSpan mAlphaForegroundColorSpan;
@OverRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMinHeaderHeight = getResources().getDimensionPixelSize(R.dimen.min_header_height);
mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.header_height);
mMinHeaderTranslation = -mMinHeaderHeight + getActionBarHeight();
setContentView(R.layout.activity_main);
mHeaderPicture = (KenBurnsSupportView) findViewById(R.id.header_picture);
mHeaderPicture.setResourceIds(R.drawable.pic0, R.drawable.pic1);
mHeaderLogo = (ImageView) findViewById(R.id.header_logo);
mHeader = findViewById(R.id.header);
mPagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(4);
mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
mPagerAdapter.setTabHolderScrollingContent(this);
mViewPager.setAdapter(mPagerAdapter);
mPagerSlidingTabStrip.setViewPager(mViewPager);
mPagerSlidingTabStrip.setOnPageChangeListener(this);
mSpannableString = new SpannableString(getString(R.string.actionbar_title));
mAlphaForegroundColorSpan = new AlphaForegroundColorSpan(0xffffffff);
ViewHelper.setAlpha(getActionBarIconView(), 0f);
getSupportActionBar().setBackgroundDrawable(null);
}
@OverRide
public void onPageScrollStateChanged(int arg0) {
// nothing
}
@OverRide
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// nothing
}
@OverRide
public void onPageSelected(int position) {
SparseArrayCompat scrollTabHolders = mPagerAdapter.getScrollTabHolders();
ScrollTabHolder currentHolder = scrollTabHolders.valueAt(position);
currentHolder.adjustScroll((int) (mHeader.getHeight() + ViewHelper.getTranslationY(mHeader)));
}
@OverRide
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount, int pagePosition) {
if (mViewPager.getCurrentItem() == pagePosition) {
int scrollY = getScrollY(view);
ViewHelper.setTranslationY(mHeader, Math.max(-scrollY, mMinHeaderTranslation));
float ratio = clamp(ViewHelper.getTranslationY(mHeader) / mMinHeaderTranslation, 0.0f, 1.0f);
interpolate(mHeaderLogo, getActionBarIconView(), sSmoothInterpolator.getInterpolation(ratio));
setTitleAlpha(clamp(5.0F * ratio - 4.0F, 0.0F, 1.0F));
}
}
@OverRide
public void adjustScroll(int scrollHeight) {
// nothing
}
public int getScrollY(AbsListView view) {
View c = view.getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = view.getFirstVisiblePosition();
int top = c.getTop();
int headerHeight = 0;
if (firstVisiblePosition >= 1) {
headerHeight = mHeaderHeight;
}
return -top + firstVisiblePosition * c.getHeight() + headerHeight;
}
public static float clamp(float value, float max, float min) {
return Math.max(Math.min(value, min), max);
}
private void interpolate(View view1, View view2, float interpolation) {
getOnScreenRect(mRect1, view1);
getOnScreenRect(mRect2, view2);
float scaleX = 1.0F + interpolation * (mRect2.width() / mRect1.width() - 1.0F);
float scaleY = 1.0F + interpolation * (mRect2.height() / mRect1.height() - 1.0F);
float translationX = 0.5F * (interpolation * (mRect2.left + mRect2.right - mRect1.left - mRect1.right));
float translationY = 0.5F * (interpolation * (mRect2.top + mRect2.bottom - mRect1.top - mRect1.bottom));
ViewHelper.setTranslationX(view1, translationX);
ViewHelper.setTranslationY(view1, translationY - ViewHelper.getTranslationY(mHeader));
ViewHelper.setScaleX(view1, scaleX);
ViewHelper.setScaleY(view1, scaleY);
}
private RectF getOnScreenRect(RectF rect, View view) {
rect.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
return rect;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public int getActionBarHeight() {
if (mActionBarHeight != 0) {
return mActionBarHeight;
}
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB){
getTheme().resolveAttribute(android.R.attr.actionBarSize, mTypedValue, true);
}else{
getTheme().resolveAttribute(R.attr.actionBarSize, mTypedValue, true);
}
mActionBarHeight = TypedValue.complexToDimensionPixelSize(mTypedValue.data, getResources().getDisplayMetrics());
return mActionBarHeight;
}
private void setTitleAlpha(float alpha) {
mAlphaForegroundColorSpan.setAlpha(alpha);
mSpannableString.setSpan(mAlphaForegroundColorSpan, 0, mSpannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(mSpannableString);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private ImageView getActionBarIconView() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
return (ImageView)findViewById(android.R.id.home);
}
return (ImageView)findViewById(android.support.v7.appcompat.R.id.home);
}
public class PagerAdapter extends FragmentPagerAdapter {
private SparseArrayCompat<ScrollTabHolder> mScrollTabHolders;
private final String[] TITLES = { "Page 1", "Page 2", "Page 3", "Page 4"};
private ScrollTabHolder mListener;
public PagerAdapter(FragmentManager fm) {
super(fm);
mScrollTabHolders = new SparseArrayCompat<ScrollTabHolder>();
}
public void setTabHolderScrollingContent(ScrollTabHolder listener) {
mListener = listener;
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public Fragment getItem(int position) {
ScrollTabHolderFragment fragment = (ScrollTabHolderFragment) SampleListFragment.newInstance(position);
mScrollTabHolders.put(position, fragment);
if (mListener != null) {
fragment.setScrollTabHolder(mListener);
}
return fragment;
}
public SparseArrayCompat<ScrollTabHolder> getScrollTabHolders() {
return mScrollTabHolders;
}
}
public static void setscrollh(int h){
scrollh=h;
}
public static int getscrollh(){
return scrollh;
}
}
I added a hashmap that keeps track of the scrolling position for each listview. Views settings are automatically added to the hashmap and then their settings are loaded back when needed.
I also wrote a function in the activity that basically keeps track of the scroll height. Obviously the header height is changing in 1 listview and when we switch tabs we want to be able to ask the activity the height of the original header. We then do a check to see if it was the minimum header size or the full header size then we simply do some tweaking to align things a bit.
There are probably better ways to do it... this is just an idea that allows you to keep track of scroll positions across listviews and maintain headers.
:)
If anyone comes up with anything better or this helps in anyway do let me know.
Hi,
I edited the layout a bit for my project's purpose as below:
<com.flavienlaurent.notboringactionbar.KenBurnsView
android:id="@+id/header_picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/picture0" />
// I replace the imageview with a custom view
<ImageView
android:id="@+id/header_logo"
android:layout_width="@dimen/header_logo_size"
android:layout_height="@dimen/header_logo_size"
android:layout_centerInParent="true"
android:layout_alignParentTop="true"
android:paddingTop="15dp"
/>
<ImageView
android:id="@+id/header_logo_hide"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_centerHorizontal="true" />
<TextView
android:id="@+id/header_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/header_logo"
android:layout_centerHorizontal="true
android:paddingTop="20dp"
android:textSize="20dp"
android:textStyle="bold" />
</RelativeLayout>
</FrameLayout>
and I use this layout in a fragment, so the code was changed a bit to work in fragment
Issue: when open the fragment, the header_logo is not displayed unless I make a initial action like scroll or touch or click.
Please help to advise me.
i can't click pagerSlidingTabStrip's children. because os 2.3 can't support layout change after animated moving. so finally write this
if (pre Honeycome) {
mHeader.setPadding(0, Math.max(-scrollY, mMinHeaderTranslation), 0, 0);
} else {
ViewHelper.setTranslationY(mHeader, Math.max(-scrollY, mMinHeaderTranslation));
}
Hello,
I am using this library for my App. But i have Recycler view with in the tabs and your example is for ListView. OnScrollListener interface in ListView while it is abstract class with in the recyclerview. Now i am little confuse to use your library with that same. Can you please update it to have recyclerview support? or please let me know how i can update it to have support for the recyclerview.
Sincerely,
Shreyash.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.