From 0ab51774ac7a20b855b3bfe046948b554cd0df07 Mon Sep 17 00:00:00 2001 From: aurel Date: Mon, 22 Sep 2014 23:14:47 +0200 Subject: [PATCH] Library setup --- .gitignore | 1 + build.gradle | 18 ++++++ gradle.properties | 3 + gradle/wrapper/gradle-wrapper.properties | 4 +- library/.gitignore | 2 + library/build.gradle | 10 +++ library/src/main/AndroidManifest.xml | 6 ++ .../stickyheaders/StickyHeadersAdapter.java | 12 ++++ .../StickyHeadersItemDecoration.java | 62 +++++++++++++++++++ settings.gradle | 1 + 10 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 library/.gitignore create mode 100644 library/build.gradle create mode 100644 library/src/main/AndroidManifest.xml create mode 100644 library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersAdapter.java create mode 100644 library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index d75bb24..a9dad0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .gradle .idea build/ +*.iml # Ignore Gradle GUI config gradle-app.setting diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a3cc33f --- /dev/null +++ b/build.gradle @@ -0,0 +1,18 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.12.+' + } +} +def isReleaseBuild() { + return version.contains("SNAPSHOT") == false +} +allprojects { + version = VERSION_NAME + group = GROUP + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..54351c2 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ + +VERSION_NAME=0.1.0 +GROUP=com.eowise \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9679dbb..991c577 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Sep 22 01:04:39 CEST 2014 +#Mon Sep 22 01:26:00 CEST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip diff --git a/library/.gitignore b/library/.gitignore new file mode 100644 index 0000000..7b00bbc --- /dev/null +++ b/library/.gitignore @@ -0,0 +1,2 @@ +build/ +*.iml \ No newline at end of file diff --git a/library/build.gradle b/library/build.gradle new file mode 100644 index 0000000..22e4534 --- /dev/null +++ b/library/build.gradle @@ -0,0 +1,10 @@ +apply plugin: 'com.android.library' + +dependencies { + compile 'com.android.support:recyclerview-v7:+' +} + +android { + compileSdkVersion 'android-L' + buildToolsVersion '20.0.0' +} \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6a97312 --- /dev/null +++ b/library/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + diff --git a/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersAdapter.java b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersAdapter.java new file mode 100644 index 0000000..d367482 --- /dev/null +++ b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersAdapter.java @@ -0,0 +1,12 @@ +package com.eowise.recyclerview.stickyheaders; + +import android.view.ViewGroup; + +public interface StickyHeadersAdapter { + + HeaderViewHolder onCreateViewHolder(ViewGroup parent); + + void onBindViewHolder(HeaderViewHolder headerViewHolder, ItemViewHolder itemViewHolder, int position); + + long getHeaderId(ItemViewHolder viewHolder, int position); +} diff --git a/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java new file mode 100644 index 0000000..61ae550 --- /dev/null +++ b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java @@ -0,0 +1,62 @@ +package com.eowise.recyclerview.stickyheaders; + +import android.graphics.Canvas; +import android.graphics.Rect; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by aurel on 22/09/14. + */ +public class StickyHeadersItemDecoration extends RecyclerView.ItemDecoration { + + private final StickyHeadersAdapter adapter; + private final RecyclerView.ViewHolder headerViewHolder; + + private final int itemHeight; + + public StickyHeadersItemDecoration(StickyHeadersAdapter adapter, RecyclerView parent) { + this.adapter = adapter; + this.headerViewHolder = adapter.onCreateViewHolder(parent); + + int widthSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.MATCH_PARENT, View.MeasureSpec.AT_MOST); + int heightSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); + headerViewHolder.itemView.measure(widthSpec, heightSpec); + itemHeight = headerViewHolder.itemView.getMeasuredHeight(); + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent) { + final int childCount = parent.getChildCount(); + View header = headerViewHolder.itemView; + + if (!header.isLaidOut()) { + int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY); + int heightSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); + header.measure(widthSpec, heightSpec); + header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); + } + + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + float y = child.getY() < itemHeight ? 0 : child.getY() - itemHeight; + y = child.getY() + child.getHeight() < itemHeight ? y - (itemHeight - (child.getY() + child.getHeight())) : y; + final RecyclerView.ViewHolder itemViewHolder = parent.getChildViewHolder(child); + + adapter.onBindViewHolder(headerViewHolder, itemViewHolder, itemViewHolder.getPosition()); + + c.save(); + c.translate(0, y); + header.draw(c); + c.restore(); + } + } + + @Override + public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { + + outRect.set(0, itemHeight, 0, 0); + } + +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..64e1816 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include 'library' \ No newline at end of file