From 120a8fb43f9fc1f4afa421c29762d990b5724831 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 13 Aug 2015 16:36:35 +0100 Subject: [PATCH] Fixed orientation changed issues. Added abstract class implementation Changed example project + readme Signed-off-by: unknown --- README.md | 47 ++++++------- .../parallaxrecycleradapter/MainActivity.java | 51 +++++++------- .../ParallaxRecyclerAdapter.java | 70 ++++++------------- 3 files changed, 67 insertions(+), 101 deletions(-) diff --git a/README.md b/README.md index 3acc668..3739069 100644 --- a/README.md +++ b/README.md @@ -30,33 +30,26 @@ android-parallax-recycleview ```java List myContent = new ArrayList(); // or another object list -ParallaxRecyclerAdapter myAdapter = new ParallaxRecyclerAdapter(myContent); // pass the list to the constructor -``` - - - Implement `ParallaxRecyclerAdapter.RecyclerAdapterMethods`. - -```java -myAdapter.implementRecyclerAdapterMethods(new ParallaxRecyclerAdapter.RecyclerAdapterMethods() { - @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { - // If you're using your custom handler (as you should of course) - // you need to cast viewHolder to it. - ((MyCustomViewHolder) viewHolder).textView.setText(myContent.get(i)); // your bind holder routine. - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { - // Here is where you inflate your row and pass it to the constructor of your ViewHolder - return new MyCustomViewHolder(LayoutInflater.from( - viewGroup.getContext()).inflate(R.layout.myRow, viewGroup, false)); - } - - @Override - public int getItemCount() { - // return the content of your array - return myContent.size(); - } -}); +ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter(content) { + @Override + public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter adapter, int i) { + // If you're using your custom handler (as you should of course) + // you need to cast viewHolder to it. + ((MyCustomViewHolder) viewHolder).textView.setText(myContent.get(i)); // your bind holder routine. + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, final ParallaxRecyclerAdapter adapter, int i) { + // Here is where you inflate your row and pass it to the constructor of your ViewHolder + return new MyCustomViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.myRow, viewGroup, false)); + } + + @Override + public int getItemCountImpl(ParallaxRecyclerAdapter adapter) { + // return the content of your array + return myContent.size(); + } + }; ``` - Now we set the parallax header. You need to pass the `RecyclerView` too to implement the scroll listeners. diff --git a/example/src/main/java/com/poliveira/apps/parallaxrecycleradapter/MainActivity.java b/example/src/main/java/com/poliveira/apps/parallaxrecycleradapter/MainActivity.java index 95b704a..abd1f9a 100644 --- a/example/src/main/java/com/poliveira/apps/parallaxrecycleradapter/MainActivity.java +++ b/example/src/main/java/com/poliveira/apps/parallaxrecycleradapter/MainActivity.java @@ -17,9 +17,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Created by poliveira on 26/02/2015. - */ public class MainActivity extends Activity { private boolean isNormalAdapter = false; @@ -56,22 +53,15 @@ private void createCardAdapter(RecyclerView recyclerView) { for (int i = 0; i < 50; i++) { content.add("item " + i); } - final ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter<>(content); - HeaderLayoutManagerFixed layoutManagerFixed = new HeaderLayoutManagerFixed(this); - recyclerView.setLayoutManager(layoutManagerFixed); - View header = getLayoutInflater().inflate(R.layout.header, recyclerView, false); - layoutManagerFixed.setHeaderIncrementFixer(header); - adapter.setShouldClipView(false); - adapter.setParallaxHeader(header, recyclerView); - adapter.setData(content); - adapter.implementRecyclerAdapterMethods(new ParallaxRecyclerAdapter.RecyclerAdapterMethods() { + + final ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter(content) { @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { + public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter adapter, int i) { ((ViewHolder) viewHolder).textView.setText(adapter.getData().get(i)); } @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, final ParallaxRecyclerAdapter adapter, int i) { final ViewHolder holder = new ViewHolder(getLayoutInflater().inflate(R.layout.row_recyclerview_cards, viewGroup, false)); //don't set listeners on onBindViewHolder. For more info check http://androidshenanigans.blogspot.pt/2015/02/viewholder-pattern-common-mistakes.html holder.textView.setOnClickListener(new View.OnClickListener() { @@ -84,10 +74,18 @@ public void onClick(View v) { } @Override - public int getItemCount() { + public int getItemCountImpl(ParallaxRecyclerAdapter adapter) { return content.size(); } - }); + }; + + HeaderLayoutManagerFixed layoutManagerFixed = new HeaderLayoutManagerFixed(this); + recyclerView.setLayoutManager(layoutManagerFixed); + View header = getLayoutInflater().inflate(R.layout.header, recyclerView, false); + layoutManagerFixed.setHeaderIncrementFixer(header); + adapter.setShouldClipView(false); + adapter.setParallaxHeader(header, recyclerView); + adapter.setData(content); recyclerView.setAdapter(adapter); } @@ -96,19 +94,15 @@ private void createAdapter(RecyclerView recyclerView) { for (int i = 0; i < 50; i++) { content.add("item " + i); } - final ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter<>(content); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); - View header = getLayoutInflater().inflate(R.layout.header, recyclerView, false); - adapter.setParallaxHeader(header, recyclerView); - adapter.setData(content); - adapter.implementRecyclerAdapterMethods(new ParallaxRecyclerAdapter.RecyclerAdapterMethods() { + + final ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter(content) { @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { + public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter adapter, int i) { ((ViewHolder) viewHolder).textView.setText(adapter.getData().get(i)); } @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, final ParallaxRecyclerAdapter adapter, int i) { final ViewHolder holder = new ViewHolder(getLayoutInflater().inflate(R.layout.row_recyclerview, viewGroup, false)); //don't set listeners on onBindViewHolder. For more info check http://androidshenanigans.blogspot.pt/2015/02/viewholder-pattern-common-mistakes.html holder.textView.setOnClickListener(new View.OnClickListener() { @@ -121,10 +115,15 @@ public void onClick(View v) { } @Override - public int getItemCount() { + public int getItemCountImpl(ParallaxRecyclerAdapter adapter) { return content.size(); } - }); + }; + + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + View header = getLayoutInflater().inflate(R.layout.header, recyclerView, false); + adapter.setParallaxHeader(header, recyclerView); + adapter.setData(content); recyclerView.setAdapter(adapter); } diff --git a/library/src/main/java/com/poliveira/parallaxrecyclerview/ParallaxRecyclerAdapter.java b/library/src/main/java/com/poliveira/parallaxrecyclerview/ParallaxRecyclerAdapter.java index 8093697..10bcb3f 100644 --- a/library/src/main/java/com/poliveira/parallaxrecyclerview/ParallaxRecyclerAdapter.java +++ b/library/src/main/java/com/poliveira/parallaxrecyclerview/ParallaxRecyclerAdapter.java @@ -5,6 +5,7 @@ import android.graphics.Rect; import android.os.Build; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.animation.TranslateAnimation; @@ -12,12 +13,8 @@ import java.util.List; - -/** - * Created by poliveira on 03/11/2014. - */ -public class ParallaxRecyclerAdapter extends RecyclerView.Adapter { - private final float SCROLL_MULTIPLIER = 0.5f; +public abstract class ParallaxRecyclerAdapter extends RecyclerView.Adapter { + private static final float SCROLL_MULTIPLIER = 0.5f; public static class VIEW_TYPES { public static final int NORMAL = 1; @@ -25,14 +22,11 @@ public static class VIEW_TYPES { public static final int FIRST_VIEW = 3; } - public interface RecyclerAdapterMethods { - void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i); - - RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i); + public abstract void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder,ParallaxRecyclerAdapter adapter, int i); - int getItemCount(); - } + public abstract RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup,ParallaxRecyclerAdapter adapter, int i); + public abstract int getItemCountImpl(ParallaxRecyclerAdapter adapter); public interface OnClickEvent { /** @@ -57,11 +51,9 @@ public interface OnParallaxScroll { private List mData; private CustomRelativeWrapper mHeader; - private RecyclerAdapterMethods mRecyclerAdapterMethods; private OnClickEvent mOnClickEvent; private OnParallaxScroll mParallaxScroll; private RecyclerView mRecyclerView; - private int mTotalYScrolled; private boolean mShouldClipView = true; /** @@ -102,8 +94,7 @@ public void setParallaxHeader(View header, final RecyclerView view) { public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (mHeader != null) { - mTotalYScrolled += dy; - translateHeader(mTotalYScrolled); + translateHeader(mRecyclerView.computeVerticalScrollOffset()); } } }); @@ -111,35 +102,31 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) { - if (mRecyclerAdapterMethods == null) - throw new NullPointerException("You must call implementRecyclerAdapterMethods"); if (i != 0 && mHeader != null) { - mRecyclerAdapterMethods.onBindViewHolder(viewHolder, i - 1); - } else if (i != 0) - mRecyclerAdapterMethods.onBindViewHolder(viewHolder, i); - if (mOnClickEvent != null) - viewHolder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mOnClickEvent.onClick(v, i - (mHeader == null ? 0 : 1)); - } - }); + onBindViewHolderImpl(viewHolder,this, i - 1); + } else if (i != 0) { + onBindViewHolderImpl(viewHolder, this, i); + } } @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { - if (mRecyclerAdapterMethods == null) - throw new NullPointerException("You must call implementRecyclerAdapterMethods"); + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) { if (i == VIEW_TYPES.HEADER && mHeader != null) return new ViewHolder(mHeader); if (i == VIEW_TYPES.FIRST_VIEW && mHeader != null && mRecyclerView != null) { - RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForPosition(0); + final RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForPosition(0); if (holder != null) { translateHeader(-holder.itemView.getTop()); - mTotalYScrolled = -holder.itemView.getTop(); + if (mOnClickEvent != null) + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mOnClickEvent.onClick(v, holder.getAdapterPosition() - (mHeader == null ? 0 : 1)); + } + }); } } - return mRecyclerAdapterMethods.onCreateViewHolder(viewGroup, i); + return onCreateViewHolderImpl(viewGroup,this, i); } /** @@ -200,29 +187,16 @@ public void removeItem(T item) { public int getItemCount() { - if (mRecyclerAdapterMethods == null) - throw new NullPointerException("You must call implementRecyclerAdapterMethods"); - return mRecyclerAdapterMethods.getItemCount() + (mHeader == null ? 0 : 1); + return getItemCountImpl(this) + (mHeader == null ? 0 : 1); } @Override public int getItemViewType(int position) { - if (mRecyclerAdapterMethods == null) - throw new NullPointerException("You must call implementRecyclerAdapterMethods"); if (position == 1) return VIEW_TYPES.FIRST_VIEW; return position == 0 ? VIEW_TYPES.HEADER : VIEW_TYPES.NORMAL; } - /** - * You must call this method to set your normal adapter methods - * - * @param callbacks - */ - public void implementRecyclerAdapterMethods(RecyclerAdapterMethods callbacks) { - mRecyclerAdapterMethods = callbacks; - } - static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView);