GithubHelp home page GithubHelp logo

sticky-headers-recyclerview's Introduction

This project is no longer being maintained

sticky-headers-recyclerview

This decorator allows you to easily create section headers for RecyclerViews using a LinearLayoutManager in either vertical or horizontal orientation.

Credit to Emil Sjölander for creating StickyListHeaders, a library that many of us relied on for sticky headers in our listviews.

Here is a quick video of it in action (click to see the full video):

animated gif demo

animated gif demo

Download

Current version: Maven Central

compile 'com.timehop.stickyheadersrecyclerview:library:[latest.version.number]@aar'

Usage

There are three main classes, StickyRecyclerHeadersAdapter, StickyRecyclerHeadersDecoration, and StickyRecyclerHeadersTouchListener.

StickyRecyclerHeadersAdapter has a very similar interface to the RecyclerView.Adapter, and it is recommended that you make your RecyclerView.Adapter implement StickyRecyclerHeadersAdapter.

There interface looks like this:

public interface StickyRecyclerHeadersAdapter<VH extends RecyclerView.ViewHolder> {
  public long getHeaderId(int position);

  public VH onCreateHeaderViewHolder(ViewGroup parent);

  public void onBindHeaderViewHolder(VH holder, int position);

  public int getItemCount();
}

The second class, StickyRecyclerHeadersDecoration, is where most of the magic happens, and does not require any configuration on your end. Here's an example from onCreate() in an activity:

mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mAdapter = new MyStickyRecyclerHeadersAdapter();
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
mRecyclerView.addItemDecoration(new StickyRecyclerHeadersDecoration(mAdapter));

StickyRecyclerHeadersTouchListener allows you to listen for clicks on header views. Simply create an instance of StickyRecyclerHeadersTouchListener, set the OnHeaderClickListener, and add the StickyRecyclerHeadersTouchListener as a touch listener to your RecyclerView.

StickyRecyclerHeadersTouchListener touchListener =
    new StickyRecyclerHeadersTouchListener(recyclerView, headersDecor);
touchListener.setOnHeaderClickListener(
    new StickyRecyclerHeadersTouchListener.OnHeaderClickListener() {
      @Override
      public void onHeaderClick(View header, int position, long headerId) {
        Toast.makeText(MainActivity.this, "Header position: " + position + ", id: " + headerId,
            Toast.LENGTH_SHORT).show();
      }
    });
mRecyclerView.addOnItemTouchListener(touchListener);

The StickyHeaders aren't aware of your adapter so if you must notify them when your data set changes.

    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
      @Override public void onChanged() {
        headersDecor.invalidateHeaders();
      }
    });

If the Recyclerview's layout manager implements getExtraLayoutSpace (to preload more content then is visible for performance reasons), you must implement ItemVisibilityAdapter and pass an instance as a second argument to StickyRecyclerHeadersDecoration's constructor.

    @Override
    public boolean isPositionVisible(final int position) {
        return layoutManager.findFirstVisibleItemPosition() <= position
            && layoutManager.findLastVisibleItemPosition() >= position;
    }

Item animators don't play nicely with RecyclerView decorations, so your mileage with that may vary.

Compatibility

API 11+

Known Issues

  • The header views aren't recycled at this time. Contributions are most welcome.

  • I haven't tested this with ItemAnimators yet.

  • The header views are drawn to a canvas, and are not actually a part of the view hierarchy. As such, they can't have touch states, and you may run into issues if you try to load images into them asynchronously.

Version History

0.4.3 (12/24/2015) - Change minSDK to 11, fix issue with header bounds caching

0.4.2 (8/21/2015) - Add support for reverse ReverseLayout in LinearLayoutManager by AntonPukhonin

0.4.1 (6/24/2015) - Fix "dancing headers" by DarkJaguar91

0.4.0 (4/16/2015) - Code reorganization by danoz73, fixes for different sized headers, performance improvements

0.3.6 (1/30/2015) - Prevent header clicks from passing on the touch event

0.3.5 (12/12/2014) - Add StickyRecyclerHeadersDecoration.invalidateHeaders() method

0.3.4 (12/3/2014) - Fix issues with rendering of header views with header ID = 0

0.3.3 (11/13/2014) - Fixes for padding, support views without headers

0.3.2 (11/1/2014) - Bug fixes for list items with margins and deleting items

0.2 (10/3/2014) - Add StickyRecyclerHeadersTouchListener

0.1 (10/2/2014) - Initial Release

sticky-headers-recyclerview's People

Contributors

alexcohn avatar arseniocosta1 avatar danoz73 avatar darkjaguar91 avatar djdmbrwsk avatar emanuelet avatar jacobtabak avatar shyish avatar webmaster128 avatar xblonde avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sticky-headers-recyclerview's Issues

IndexOutBound

After your commit about "Draw headers with header ID = 0", the previous bug about delete last item is appear again. when i tried to delete my last item always get indexoutboundexception

Adding Items To Top of Data Causes Layout Issues

Using adapter.notifyItemRangeInsert(0, newItemsSize) causes headers initially to be drawn in the wrong place, and gaps to be added between items where there shouldn't be.

We are calling headersDecor.invalidateHeaders().

MinSDK is 14 instead of 7

If I add this library to a project with minSDK 10, I get this:

`Error:Gradle: Execution failed for task ':app:processAppAlphaManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 10 cannot be smaller than version 14 declared in library /.../app/build/intermediates/exploded- aar/com.timehop.stickyheadersrecyclerview/library/0.3.6/AndroidManifest.xml

This can easily be fixed by <uses-sdk tools:overrideLibrary="com.timehop.stickyheadersrecyclerview"/> but maybe you can change it anyway.

Bug : First Header Section became mess when child layout have layout_margin

I got a problem when i try to make child item layout use android:layout_margin

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
 card_view:cardCornerRadius="4dp"
 android:layout_margin="5dp">

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="?android:listPreferredItemHeight"
        android:background="@drawable/statelist_item_background"
        android:gravity="left|center_vertical"
        android:paddingLeft="16dp"
        android:textAppearance="?android:textAppearanceListItem" />

</android.support.v7.widget.CardView>

Result
screenshot_2014-10-31-13-38-35

but when i remove android:layout_margin="5dp" on cardView, it became good again

Problems with Item Animators

I think we'll need to create a custom item animator that will work with this. Noticed some weird timing issues when adding/removing items, especially when adding or removing several at a time.

JavaDoc of the interface StickyRecyclerHeadersAdapter.getHeaderId --> what about zero return values?

Hi, first of all many thanks for your nice libary! But, I'm wondering if there is a possibilty to improve the handling of zeros in the method 'getHeaderId'?
For example, if you alter the function in MainActivity.SampleArrayHeadersAdapter in your sample implementation to create zero values:
@OverRide
public long getHeaderId(int position) {
return getItem(position).charAt(0) - 'A'; // this will give '0' for all animals starting with 'A'
}
...the first header will appear, but will not be filled. Maybe you just can clearify the JavaDoc in the Interface?

Best Regards, Martin

Header Disaapears

if (i == 1) {
return i;
}else {
return -1;
}

this is my code for getHeaderId, header only show for a while and disappears. it should not disappear until it shows on the list, why this happen?

Dynamic Content

I haven't test this, but does the sticky headers work with dynamic contect? Another sticky header library for RecyclerView needs static id's.

AbstractMethodError in StickyRecyclerHeadersTouchListener

Hi,
abstract method void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) in OnItemTouchListener is not implemented in StickyRecyclerHeadersTouchListener causing an AbstractMethodError Exception
I use SwipeLayout within An ObservableRecyclerView
The error appeared when i added a touch listener on the sticky header
I was able to solve this by extending StickyRecyclerHeadersTouchListener and overriding onRequestDisallowInterceptTouchEvent with an empty implementation.

Thanks.

First header position

Hello,
I'm testing your library with the sample application.

I noticed that if i remove the first element of the dataset (Animals Below!) the first header is drawn after the first element of the list.
In this case I have : Abyssinian [A header] Adelie Penguin ... whereas the header was expected first.

Does that mean we always need to add a dummy elementto get the header well positioned ?

Thanks

Any way to improve performance?

Really nice work on this! Can you think of a way to improve performance? Adding the headers makes the list scrolling not very smooth, this is even on a Note 4. The onDraw adds over 70ms per draw, can anything be done you think?

HeaderViews with no clickstate

I tried to make them clickable, dispatching touch events directly to decorator headerviews, but the state isn't changed.

Any help?

Right now, the click state passes through the decoration.

Extra spacing added every time the adapter is updated

Every time the adapter is refreshed in this code, the padding between headers and sections is increased. This is not the intended result

Here is the code I use to update the dataset. (ultimately notify data set is changed is called, the headerDecors are updated and the listview is reattached to the headers and the new adapter)

                                         if(mPerf == null)
                                                mPerf = new PerformanceAdapter(list, context);
                                            else{
                                                mPerf.updateList(list);
                                            }
                                            recList.removeItemDecoration(headersDecor);

                                            if(headersDecor!=null){
                                                headersDecor.invalidateHeaders();
                                            }
                                            headersDecor = new StickyRecyclerHeadersDecoration(mPerf);
                                            recList.addItemDecoration(headersDecor);
                                            recList.setAdapter(mPerf);

Headers hiding scrollbar

The headers seem to be at the foreground of the entire recyclerview. Therefore, the scrollbar is hidden behind the headers. Is there a way to fix this? Thanks!

Touch feedback on headers possible

Is that possible? The headers don't get the focus, so buttons and similiar are not possible on decorators.

But is it possible to at least give some touch feedback?

Support for Views without Headers

Since there are no HeaderViews or FooterViews in RecyclerView, we should support views not having headers, so they can be used as header and footer views.

I think a decent approach will be to return a header id < 0 to indicate the view shouldn't have a header.

Headers with different heights do not scroll properly

If you change onBindViewHeader in MainActivity.java in the samples in the following way you will see that the headers overlap in an odd way when scrolling if they are different sizes. Scroll down to when E and F occur in the sample.

@OverRide
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) {
TextView textView = (TextView) holder.itemView;
if(position % 2 ==0 ) {
textView.setText("test\n"+String.valueOf(getItem(position).charAt(0)));
} else {
textView.setText(String.valueOf(getItem(position).charAt(0)));
}
holder.itemView.setBackgroundColor(getRandomColor());
}

device-2015-03-25-083130

Bug : First Header Section became mess when recycler view have padding

Hi, i found new bug, so when in recycler view had padding, the first header section became mess

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/spinner"
        android:clipToPadding="false"
        android:paddingBottom="40dp"
        android:paddingTop="40dp"
        android:scrollbarStyle="outsideOverlay" />

you can try in my repo : https://github.com/fjr619/RecyclerViewSticky

thank you

Header disappering

I'm using your lib for a project that's displaying groups of pictures by month. If I scroll to near the bottom, and then move up through the pictures, the sticky header disappears seemingly randomly. When moving in the other direction its fine.

Here's screen shot.
device-2015-07-04-182104

IndexOutOfBoundsException

// My English is very poor. I find
if(layoutManager.findLastVisibleItemPosition() == datas.size()) {
// click item will get IndexOutOfBoundsException
}

Dancing header with 0.4.1

dancing header

i still got dancing header on new lib : 0.4.1 when i want to delete item with multiple selection. if i just delete it one by one without multiple selection, it was no problem

Header and child item could clicked together

I have a problem when I want to click on the header, the child item go to click as well. It occurs when a child there were behind header
screen shot 2015-07-01 at 9 23 42 am
at that picture when i want to just click the Header "A", the child on behind the header go to click as well

Constructing `StickyRecyclerHeadersDecoration` w/ Orientation param

Similar to how a LinearLayoutManager is constructed with an orientation parameter, it may make sense for the StickyRecyclerHeadersDecoration object to be constructed with an orientation parameter as opposed to implicitly finding the orientation internally from the RecyclerView object.

I did not make this change because it wouldn't be backwards compatible, and you would need to decide if you wanted to move in this direction, but it could improve some of the underlying code.

Bug when delete item

I use your lib to try recycler view with sticky header, anything is work good, but when i delete item, sometimes it became mess and when i want multiple delete from the bottom of item yes that bug appear again.

It's not working with GridLayout Manager

I have following GridLayout manager set to Recycle view but it's Header Decoration not working .

final GridLayoutManager mGridLayouyt=new GridLayoutManager(getActivity(),3);


        mGridLayouyt.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {

                LogUtil.i("LOG_TAG", "Span Count Position -->" + position);

                //(isSectionHeaderPosition(position))? layoutManager.getSpanCount() : 1 ;

                return mArrayModel.get(position).isSection() ? mGridLayouyt.getSpanCount() : 1;

            }
        });

        mGridLayouyt.setSpanCount(3);


        mRecycleView.setLayoutManager(mGridLayouyt);

About Header item

Can let the header item top to the limit don't lock , i want the item up to diapper

Negative header id doesn't work

As shown in the docs, I was trying it out and some of my strings return negative hashcode and that's what I was returning in getHeaderId(). Whichever item returns a negative header id, header isn't created for that. I tried returning absolute value and it worked for all the headers. Is this Recyclerview issue or this library's issue?

Extra margin shown on left of header

On version 0.4.0, an extra margin is shown on the left side of the header:

Imgur

On version 0.3.6, the header matches the width of the parent correctly:

Imgur

Margin on CardView applies to headers in odd ways.

For example, if a top margin is set on the CardView the sticky headers are all pushed down by that amount, see attached screenshot. This CardView has a 4dp top margin with the intent of keeping the initial content from touching the toolbar but it moves the header down which causes odd scrolling effects. I have added background color to the headers for visibility.

In addition if a start margin is set it will only affect the "stuck" header. If I set a start margin the top header will have that margin while the second will not, until it becomes the stuck header. At that point it will jump right to the margin position.

Should the drawing of the headers even obey the margins of the cards or should it only be controlled by its own layout properties and that of the recyclerview?

screenshot_2015-03-20-02-10-54

Dancing headers

If you have items that update in the recycler view, the header item for the set that updates tends to dance around.
Basically the header items moves to just above the item that has been updated and then moves back up to the correct position.

Error loading in Fragment

I have used this code successfully from my Main Activity in which I am loading data from my server onto the cards used in recycerview. Everything is working fine but now when I tried to shift the exact same code onto a fragment, it keeps giving me an error. I have changed all the getActivity to view.getContext() and made other appropriate changes in the import. Could someone help me out?

 Process: varun.brandlabs.com.zeko, PID: 13859
    android.view.InflateException: Binary XML file line #8: Error inflating class <unknown>
            at android.view.LayoutInflater.createView(LayoutInflater.java:633)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at varun.brandlabs.com.zeko.NewsFeed.MyStickyAdapter.onCreateHeaderViewHolder(MyStickyAdapter.java:53)
            at varun.brandlabs.com.zeko.NewsFeed.MyStickyAdapter.onCreateHeaderViewHolder(MyStickyAdapter.java:22)
            at com.timehop.stickyheadersrecyclerview.caching.HeaderViewCache.getHeader(HeaderViewCache.java:34)
            at com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration.getHeaderView(StickyRecyclerHeadersDecoration.java:138)
            at com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration.getItemOffsets(StickyRecyclerHeadersDecoration.java:64)
            at android.support.v7.widget.RecyclerView.getItemDecorInsetsForChild(RecyclerView.java:3583)
            at android.support.v7.widget.RecyclerView$LayoutManager.measureChildWithMargins(RecyclerView.java:6623)
            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1385)
            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1322)
            at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:556)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2673)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2971)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:562)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1626)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
            at android.view.View.layout(View.java:15631)
            at android.view.ViewGroup.layout(ViewGroup.java:4966)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2101)
            at android.view.ViewRootImpl.performTraversals(View


public class MyStickyAdapter extends RecyclerView.Adapter<MyStickyAdapter.ViewHolder>
        implements StickyRecyclerHeadersAdapter<RecyclerView.ViewHolder> {
    Context mContext;

    MyStickyAdapter(Context mContext){this.mContext=mContext;}

    public static class ViewHolder extends RecyclerView.ViewHolder{
        public TextView HeadView, Row;
        public CardView cardView; ImageView image;

        ViewHolder(final View view){
            super(view);

        }
    }

    @Override
    public long getHeaderId(int position) {
            return position;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.sample_feed_card, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public ViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.sample_feed_header, parent, false);
        ViewHolder viewHolder=new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public void onBindViewHolder (ViewHolder holder, int i) {

    }

    @Override
    public int getItemCount() {
       return 4;
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

}

As of now the code above is using default values iv placed so the childs all look the same.
2) I keep loading data asynchronously, so i need to mAdapter.add(newData) and then mAdapter.notifyItemRangeChanged. Does that work efficiently with this?

Support for a Gridview layout

Is there a good implementation of a grid layout manager for RecyclerView?

If so, is it worthwhile to implement sticky headers for it?

How do we deal with the case where the beginning of a row has a different header than the middle of a row or the end of a row?

Problems when switching to landscape and back

Our sticky list header isn't positioned correctly and leaves empty space to the right if we switch to landscape view. Anyone else having this issue and might have a possible fix?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.