diff --git a/build.gradle b/build.gradle index 762c758..48e850d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c0e747b..4f4cf7b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Dec 12 10:27:39 CST 2014 +#Thu Dec 29 14:37:07 CST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java index 4673f8c..50ea35f 100644 --- a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java +++ b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java @@ -165,4 +165,9 @@ public void invalidateHeaders() { mHeaderProvider.invalidate(); mHeaderRects.clear(); } + + public Rect getHeaderRect(int position) { + return mHeaderRects.get(position); + } + } diff --git a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java index 4a093ed..1893b8b 100644 --- a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java +++ b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java @@ -1,10 +1,13 @@ package com.timehop.stickyheadersrecyclerview; +import android.graphics.Rect; +import android.os.Build; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SoundEffectConstants; import android.view.View; +import android.view.ViewGroup; public class StickyRecyclerHeadersTouchListener implements RecyclerView.OnItemTouchListener { private final GestureDetector mTapDetector; @@ -68,6 +71,12 @@ public boolean onSingleTapUp(MotionEvent e) { if (position != -1) { View headerView = mDecor.getHeaderView(mRecyclerView, position); long headerId = getAdapter().getHeaderId(position); + Rect rect = mDecor.getHeaderRect(position); + int hOffset = rect.left - headerView.getLeft(); + int vOffset = rect.top - headerView.getTop(); + if (isChildClicked(headerView, hOffset, vOffset, e)) { + return false; + } mOnHeaderClickListener.onHeaderClick(headerView, position, headerId); mRecyclerView.playSoundEffect(SoundEffectConstants.CLICK); headerView.onTouchEvent(e); @@ -76,6 +85,31 @@ public boolean onSingleTapUp(MotionEvent e) { return false; } + private boolean isChildClicked(View headerView, int hOffset, int vOffset, MotionEvent e) { + if (headerView instanceof ViewGroup == false) { + return false; + } + ViewGroup vg = (ViewGroup) headerView; + int childCount = vg.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = vg.getChildAt(i); + if (isViewTouched(child, hOffset, vOffset, e) && child.isClickable()) { + child.performClick(); + return true; + } + } + return false; + } + + private boolean isViewTouched(View view, int hOffset, int vOffset, MotionEvent e) { + Rect rect = new Rect(); + rect.left = view.getLeft() + hOffset; + rect.right = view.getRight() + hOffset; + rect.top = view.getTop() + vOffset; + rect.bottom = view.getBottom() + vOffset; + return rect.contains((int) e.getX(), (int) e.getY()); + } + @Override public boolean onDoubleTap(MotionEvent e) { return true; diff --git a/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java b/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java index 591bd10..3b2e4af 100644 --- a/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java +++ b/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java @@ -143,15 +143,22 @@ public long getHeaderId(int position) { @Override public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) + final View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.view_header, parent, false); + view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(v.getContext(), "button"+v.getTag(), Toast.LENGTH_SHORT).show(); + } + }); return new RecyclerView.ViewHolder(view) { }; } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) { - TextView textView = (TextView) holder.itemView; + holder.itemView.findViewById(R.id.btn).setTag(position); + TextView textView = (TextView) holder.itemView.findViewById(R.id.tv); textView.setText(String.valueOf(getItem(position).charAt(0))); holder.itemView.setBackgroundColor(getRandomColor()); } diff --git a/sample/src/main/res/layout/view_header.xml b/sample/src/main/res/layout/view_header.xml index 09817f0..c35c955 100644 --- a/sample/src/main/res/layout/view_header.xml +++ b/sample/src/main/res/layout/view_header.xml @@ -1,15 +1,29 @@ - - \ No newline at end of file + android:background="#001F3F"> + + + +