Git Product home page Git Product logo

pinnedsectionitemdecoration's Introduction

Pinned section header decoration for RecyclerView.

中文版文档点这里

(Please pay attention to a better project StickyItemDecoration)

A powerful pinned section header library. The realization of ideas comes from「pinned-section-item-decoration」. Please mark a star if you think it's helpful.(^∀^)

Function

  • Large pinned section header support vertical orientation of the LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager.
  • Small pinned section header support vertical orientation of the LinearLayoutManager and GridLayoutManager which its span count is 1.
  • Support the header of the click, double click and long press event.
  • Support the child view of the click, double click and long press event.
  • It can draw the separator line and support custom separator line style. (PS: Vertical staggeredgrid layout requires fixed height, can not be randomly changed to lead to item position switch, refer to「See line 89-108 of MainActivity」)

Screenshot

大标签线性布局 大标签网格布局 大标签瀑布流布局 小标签线性布局 股市Demo

Extension library

BaseRecyclerViewAdapterHelper(It is highly recommended to use this adapter, which can greatly reduce the amount of work. The current demo is using v2.9.42.)

How to use?

To add a dependency using Gradle:

If using androidx
    compile 'com.oushangfeng:PinnedSectionItemDecoration:1.3.2-androidx'
otherwise
    compile 'com.oushangfeng:PinnedSectionItemDecoration:1.3.2'

Adapter needs to process the span count of header through the FullSpanUtil.

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        FullSpanUtil.onAttachedToRecyclerView(recyclerView, this, StockEntity.StockInfo.TYPE_HEADER);
    }

    @Override
    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        FullSpanUtil.onViewAttachedToWindow(holder, this, StockEntity.StockInfo.TYPE_HEADER);
    }

To achieve large pinned section header, RecyclerView only need to add a PinnedHeaderItemDecoration. Note that the top layer of the header where the layout can not be set marginTop.「See StockActivity

      OnHeaderClickAdapter clickAdapter = new OnHeaderClickAdapter() {

          @Override
          public void onHeaderClick(View view, int id, int position) {
              switch (id) {
                  case R.id.fl:
                       // case OnItemTouchListener.HEADER_ID:
                       Toast.makeText(StockActivity.this, "click, tag: " + mAdapter.getData().get(position).pinnedHeaderName, Toast.LENGTH_SHORT).show();
                       break;
                   case R.id.iv_more:
                       Toast.makeText(StockActivity.this, "click " + mAdapter.getData().get(position).pinnedHeaderName + "'s more button", Toast.LENGTH_SHORT)
                             .show();
                       break;
                   case R.id.checkbox:
                       final CheckBox checkBox = (CheckBox) view;
                       checkBox.setChecked(!checkBox.isChecked());
                       // invalidate ItemDecorations to draw the header
                       mRecyclerView.invalidateItemDecorations();

                       mAdapter.getData().get(position).check = checkBox.isChecked();
                       mAdapter.notifyItemChanged(position + mHeaderItemDecoration.getDataPositionOffset());

                       break;
               }
           }

       };

     mRecyclerView.addItemDecoration(
             // Set the type of pinned header
             new PinnedHeaderItemDecoration.Builder(StockEntity.StockInfo.TYPE_HEADER)
             // Set separator line resources id.
             .setDividerId(R.drawable.divider)
             // Enable draw the separator line, by default it's disable.
             .enableDivider(true)
             // Set click event for the header and its internal child view.
             .setClickIds(R.id.iv_more)
             // Disable header click event, by default it's enable.
             .disableHeaderClick(false)
             // Set the listener. If the listener is not null but disable the header click event(eg. disableHeaderClick(true)), then the callback don't return.
             .setHeaderClickListener(clickAdapter)
             .create());
    

大标签布局

To achieve small pinned section header is a little bit more complex, such as the layout A of the data .

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:background="#70E593">

    <ImageView
        android:id="@+id/iv_animal"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        tools:src="@mipmap/panda0"/>

    <TextView
        android:id="@+id/tv_pos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:textColor="#000000"
        android:textSize="18dp"
        tools:text="1"/>

</FrameLayout>

布局A

This is a layout B with a small pinned section header.

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/iv_animal"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:background="#70E593"
        tools:src="@mipmap/panda0"/>

    <ImageView
        android:id="@+id/iv_small_pinned_header"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="#5A5A5A"
        android:padding="8dp"
        android:textColor="#ffffff"
        android:textSize="18dp"
        tools:src="@mipmap/panda0"
        tools:text="熊猫"/>

</FrameLayout>

布局B

The layout B add a header compare whit layout A,then RecyclerView only need to add a SmallPinnedHeaderItemDecoration. Note that the top layer of the header where the layout can not be set marginTop.「See SecondActivity

     OnHeaderClickAdapter headerClickAdapter = new OnHeaderClickAdapter() {

          @Override
          public void onHeaderClick(View view, int id, int position) {
              if (id == R.id.iv_small_pinned_header) {
                  Toast.makeText(SecondActivity.this, "click tag: " + mAdapter.getData().get(position).getPinnedHeaderName(), Toast.LENGTH_SHORT).show();
              }
          }
     };
     mRecyclerView.addItemDecoration(
             // Constructor need to set the id and type of the header 
             new SmallPinnedHeaderItemDecoration.Builder(R.id.tv_small_pinned_header,BaseHeaderAdapter.TYPE_HEADER)
             // Enable draw the separator line, by default it's disable.
             .enableDivider(true)
             // Set separator line resources id.
             .setDividerId(R.drawable.divider)
             // Set click event for the header and its internal child view.
             .setClickIds(R.id.tv_small_pinned_header)
             // Disable header click event, by default it's enable.
             .disableHeaderClick(false)
             // Set the listener. If the listener is not null but disable the header click event(eg. disableHeaderClick(true)), then the callback don't return.
             .setHeaderClickListener(clickAdapter)
             .create());
    

License

Copyright 2016 oubowu

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

pinnedsectionitemdecoration's People

Contributors

oubowu 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

pinnedsectionitemdecoration's Issues

压力测试报错

STACK_TRACE=java.lang.ArrayIndexOutOfBoundsException: length=11; index=-1 at android.util.SparseArray.keyAt(SparseArray.java:280) at com.oushangfeng.pinnedsectionitemdecoration.callback.OnItemTouchListener.shouldIntercept(OnItemTouchListener.java:144) at com.oushangfeng.pinnedsectionitemdecoration.callback.OnItemTouchListener.access$400(OnItemTouchListener.java:17) at com.oushangfeng.pinnedsectionitemdecoration.callback.OnItemTouchListener$GestureListener.onDoubleTap(OnItemTouchListener.java:225) at android.view.GestureDetector.onTouchEvent(GestureDetector.java:563) at com.oushangfeng.pinnedsectionitemdecoration.callback.OnItemTouchListener.onInterceptTouchEvent(OnItemTouchListener.java:84) at android.support.v7.widget.RecyclerView.dispatchOnItemTouchIntercept(RecyclerView.java:2572) at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2618) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2212) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810) at android.app.Activity.dispatchTouchEvent(Activity.java:3061) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373) at android.view.View.dispatchPointerEvent(View.java:10234) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4447) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4308) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3855) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3908) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3874) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4001) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3882) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4058) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3855) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3908) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3874) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3882) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3855) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6225) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6199) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6160) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6328) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:323) at android.os.Looper.loop(Looper.java:151) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

悬浮的点击事件只有position==0的有效果,其他的就没有

mHeaderItemDecoration = new PinnedHeaderItemDecoration.Builder(AdapterFootIndex.TYPE_PARENT)
.setDividerId(R.drawable.divider).enableDivider(true)
.setClickIds(R.id.item_ll_title)
.disableHeaderClick(false)
.setHeaderClickListener(clickAdapter).create();
recyclerView.addItemDecoration(mHeaderItemDecoration);

OnHeaderClickAdapter clickAdapter = new OnHeaderClickAdapter() {

    @Override
    public void onHeaderClick(View view, int id, int position) {
        ToastUtil.showToast("tag=="+position);
    }

};

悬浮的点击事件只有position==0的有效果,其他的就没有

如果在item适配器中自己加点击事件 那么 第一个悬浮没有点击事件 其他的都有

黏性头部点击时,偶然出现ArrayIndexOutOfBoundsException异常

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at com.chad.library.adapter.base.BaseMultiItemQuickAdapter.getDefItemViewType(BaseMultiItemQuickAdapter.java:35)
at com.chad.library.adapter.base.BaseQuickAdapter.getItemViewType(BaseQuickAdapter.java:462)
at com.chad.library.adapter.base.listener.SimpleClickListener.isHeaderOrFooterPosition(SimpleClickListener.java:233)
at com.chad.library.adapter.base.listener.SimpleClickListener.access$300(SimpleClickListener.java:31)
at com.chad.library.adapter.base.listener.SimpleClickListener$ItemTouchHelperGestureListener.onLongPress(SimpleClickListener.java:160)
at android.view.GestureDetector.dispatchLongPress(GestureDetector.java:809)
at android.view.GestureDetector.access$200(GestureDetector.java:46)
at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:305)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7237)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

是否可以自定义头部吸附的位置呢?吸附事件的回调有吗?

  1. 我不想吸附到最顶部,而是距离顶部有一定的偏移量,请问该如何设置呢?我找了一下,貌似没有暴露出相关的方法呢。
  2. 我想在头部刚开始吸附的时候,以及结束吸附的时候,需要最一些事情,有没有相应的事件可以监听呢?

非常感谢,如果能够提供帮助呢!!

demo里StockActivity里checkbox的点击事件问题

当其他悬浮条目顶上来之后会改变checkbox状态,我把、
// 刷新ItemDecorations,导致重绘刷新头部
//mRecyclerView.invalidateItemDecorations();
这个注释掉也不行,不知道是不是可以解决这个问题

点击Header的问题

1.点击/长按Header会有振动反馈,可以去掉么?
2.点击Header的手势事件会传递一个ACTION_DOWN到下面的RecyclerView上

Header not removed

Header not removed if data in adapter exist and then set to empty

screenshot_20161029-213124

become

screenshot_20161029-213053

Snippet code at the end of onCreate() method on MainActivity in example

private void removeData() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            removeDataAndUpdateAdapter();
        }
    }, 5000);
}

private void removeDataAndUpdateAdapter() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mAdapter.setNewData(new ArrayList<PinnedHeaderEntity<Integer>>());
            mAdapter.notifyDataSetChanged();
        }
    });
}

配合加载更多使用问题

配合加载更多使用时候,底部的loadingView没有显示,应该是在10条数据之下,会不会是加多个sticky布局高度算进去了 我的sticky高度刚好为45dp与BaseRecyclerViewAdapterHelper加载更多View一样,请问下是框架支持问题还是我使用错了?谢谢

ambiguous method call.both

在使用BaseRecyclerviewAdapterHelper 2.4.4版本及以上时,重写onViewAttachedToWindow会报错
ambiguous method call.both

楼主可以试一下,最新BaseRecyclerviewadapterhelper.
使用楼主导入的BaseRecyclerviewadapterhelper版本没有问题

pinned title 设置margin后显示问题

image

我在左边留了点 margin
image

这里是透明的。

但是实际效果
22

你看 最左边的数字14.0被遮住了。 应该不会被遮住。
那里应该是透明色,不是白色呀。

vRecycler.addItemDecoration(
                PinnedHeaderItemDecoration.Builder(FoodAdapter.TYPE_TITLE)
                        .setDividerId(R.drawable.transparent)
                        .create())

我的设置方式如上。

头部子控件点击事件无效

RT,头部子控件的点击事件无法扑捉,只有点击整个头部的事件,无法定位到具体的。而且DEMO本身也是无法正常点击头部子控件的。像那个more的点击事件。

两个小 bug ~

滚动到顶部,RecyclerView 的 edge ripple 效果会被 pinned header 覆盖,给的 demo 中 BigPinnedHeader 中也存在这个问题,StockActivity 没有这个问题,因为往 adapter 中添加了一个 headerView,就不存在这个问题了。??

如果 PinnedHeaderItemDecoration 不添加 divider,存在一像素(或 1dp?)的边缘情况,会导致 pinned header 显示的是上一个 header 的内容。

结合SuperRecycleView使用报错

https://github.com/supercwn/SuperRecycleView
这个项目,我自定义的adapter是这样的
public class SuperAdapter extends SuperBaseAdapter implements PinnedHeaderNotifyer
实现了PinnedHeaderNotifyer接口,但是运行时还是会报java.lang.IllegalStateException: Adapter must implements PinnedHeaderNotifyer这个错误。是因为继承的是SuperBaseAdapter的原因吗?

RTL not support on first header

The first pinned section does not support RTL
screenshot_20161116-153655

The snippet code for item_pinned_header.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <!--android:padding="2dp"-->
    <TextView
        android:id="@+id/tv_animal"
        android:background="#5A5A5A"
        tools:text="熊猫"
        android:gravity="start"
        android:textSize="18dp"
        android:padding="8dp"
        android:textColor="#ffffff"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>```

粘性头部可以设置划走吗

粘性头部可以设置的像其它item一样上滑消失吗,有没有一个参数可以让粘性头部可以粘住也可以划走?,还有这个粘性头部支持复杂的布局吗,像播放视频

bug in android support 27.1.0

java.lang.IllegalStateException: ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6687)
at com.oushangfeng.pinnedsectionitemdecoration.PinnedHeaderItemDecoration.createPinnedHeader(PinnedHeaderItemDecoration.java:298)
at com.oushangfeng.pinnedsectionitemdecoration.PinnedHeaderItemDecoration.onDraw(PinnedHeaderItemDecoration.java:147)

求教在结合BaseRecyclerViewAdapterHelper实现粘性没效果

主要代码:

在fragment中:
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mHeaderItemDecoration = new

PinnedHeaderItemDecoration.Builder(IncomeAdapter.TYPE_STICKY_HEAD)
.disableHeaderClick(false).create();

mRecyclerView.addItemDecoration(mHeaderItemDecoration);

mAdapter = new IncomeAdapter(R.layout.item_income, R.layout.lv_pointrecord_header, mList);

mAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_BOTTOM);

mRecyclerView.setAdapter(mAdapter);

在Adapter中:
public class IncomeAdapter extends BaseSectionQuickAdapter<IncomeSection,BaseViewHolder> {

// public final static int TYPE_DATA = 1;
public static int TYPE_STICKY_HEAD = 1;
// public final static int TYPE_SMALL_STICKY_HEAD_WITH_DATA = 3;

public IncomeAdapter(int layoutResId, int sectionHeadResId, List data){
    super(layoutResId, sectionHeadResId, data);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
    FullSpanUtil.onAttachedToRecyclerView(recyclerView, this, TYPE_STICKY_HEAD);
}

@Override
public void onViewAttachedToWindow(BaseViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    FullSpanUtil.onViewAttachedToWindow(holder, this,TYPE_STICKY_HEAD );
}

@Override
protected void convertHead(BaseViewHolder helper, IncomeSection item) {
    helper.setText(R.id.lv_pointrecord_date,item.header);
}

@Override
protected void convert(BaseViewHolder helper, IncomeSection item) {

    Income income = item.t;
    helper.setText(R.id.tv_Week, TimeUtils.dateToWeek(income.getIncome_time()));
    helper.setText(R.id.tv_Time, income.getIncome_time());
    helper.setText(R.id.tv_Income_desc, income.getIncome_desc());
    helper.setText(R.id.tv_Income_money, "¥"+income.getIncome_monery()+"元");

}

实体类:
public class IncomeSection extends SectionEntity {

private List<Income> items;

// public static final int TYPE_HEADER = 1;
// public static final int TYPE_DATA = 2;

public IncomeSection(boolean isHeader, String header) {
    super(isHeader, header);
    items = new ArrayList<>();
}

public IncomeSection(Income income) {
    super(income);
    items = new ArrayList<>();
}

public void addIncome(Income item) {
    this.items.add(item);
}

public List<Income> getItems() {
    return items;
}

}

求教大佬,谢谢

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.