diff --git a/.gitignore b/.gitignore index 48fbd02..ebfc7a8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ local.properties # Proguard folder generated by Eclipse proguard/ /PullToZoomView/.idea +*.iml diff --git a/PullToZoomView/PullToZoomView.iml b/PullToZoomView/PullToZoomView.iml deleted file mode 100644 index 0bb6048..0000000 --- a/PullToZoomView/PullToZoomView.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/PullToZoomView/app/app.iml b/PullToZoomView/app/app.iml deleted file mode 100644 index f3cf23a..0000000 --- a/PullToZoomView/app/app.iml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PullToZoomView/app/build.gradle b/PullToZoomView/app/build.gradle index 734d5ca..3fdf409 100644 --- a/PullToZoomView/app/build.gradle +++ b/PullToZoomView/app/build.gradle @@ -1,19 +1,19 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 20 + compileSdkVersion 23 buildToolsVersion "20.0.0" defaultConfig { applicationId "com.ecloud.pulltozoomview.demo" - minSdkVersion 11 - targetSdkVersion 20 + minSdkVersion 14 + targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { - runProguard false + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } @@ -21,6 +21,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:20.0.0' + compile 'com.android.support:appcompat-v7:23.0.1' + compile 'com.android.support:recyclerview-v7:23.0.1' compile project(':library') +// compile 'com.github.frank-zhu:pullzoomview:1.0.0' } diff --git a/PullToZoomView/app/src/main/AndroidManifest.xml b/PullToZoomView/app/src/main/AndroidManifest.xml index e623720..97d9de9 100644 --- a/PullToZoomView/app/src/main/AndroidManifest.xml +++ b/PullToZoomView/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ + diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/MainActivity.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/MainActivity.java index ab1efe3..aa73389 100644 --- a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/MainActivity.java +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/MainActivity.java @@ -7,6 +7,8 @@ import android.view.MenuItem; import android.view.View; +import com.ecloud.pulltozoomview.demo.recyclerview.PullToZoomRecyclerActivity; + public class MainActivity extends ActionBarActivity { @@ -28,6 +30,13 @@ public void onClick(View v) { startActivity(new Intent(MainActivity.this, PullToZoomScrollActivity.class)); } }); + + findViewById(R.id.btn_recycler_view).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, PullToZoomRecyclerActivity.class)); + } + }); } diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomListActivity.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomListActivity.java index 29defd8..bb08e81 100644 --- a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomListActivity.java +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomListActivity.java @@ -7,11 +7,9 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.LinearLayout; import com.ecloud.pulltozoomview.PullToZoomListViewEx; @@ -44,12 +42,12 @@ protected void onCreate(Bundle savedInstanceState) { "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient"}; listView.setAdapter(new ArrayAdapter(PullToZoomListActivity.this, android.R.layout.simple_list_item_1, adapterData)); -// listView.getRootView().setOnItemClickListener(new AdapterView.OnItemClickListener() { -// @Override -// public void onItemClick(AdapterView parent, View view, int position, long id) { -// Log.e("zhuwenwu", "position = " + position); -// } -// }); + listView.getPullRootView().setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Log.e("zhuwenwu", "position = " + position); + } + }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomRecyclerViewEx.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomRecyclerViewEx.java new file mode 100644 index 0000000..442f975 --- /dev/null +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomRecyclerViewEx.java @@ -0,0 +1,392 @@ +package com.ecloud.pulltozoomview.demo; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.SystemClock; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Interpolator; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.FrameLayout; + +import com.ecloud.pulltozoomview.PullToZoomBase; +import com.ecloud.pulltozoomview.demo.recyclerview.RecyclerViewHeaderAdapter; + +/** + * Author: ZhuWenWu + * Version V1.0 + * Date: 2014/11/7 18:01. + * Description: + * Modification History: + * Date Author Version Description + * ----------------------------------------------------------------------------------- + * 2014/11/7 ZhuWenWu 1.0 1.0 + * Why & What is modified: + */ +public class PullToZoomRecyclerViewEx extends PullToZoomBase implements AbsListView.OnScrollListener { + private static final String TAG = PullToZoomRecyclerViewEx.class.getSimpleName(); + private FrameLayout mHeaderContainer; + private int mHeaderHeight; + private ScalingRunnable mScalingRunnable; + + private static final Interpolator sInterpolator = new Interpolator() { + public float getInterpolation(float paramAnonymousFloat) { + float f = paramAnonymousFloat - 1.0F; + return 1.0F + f * (f * (f * (f * f))); + } + }; + + public PullToZoomRecyclerViewEx(Context context) { + this(context, null); + } + + public PullToZoomRecyclerViewEx(Context context, AttributeSet attrs) { + super(context, attrs); + mRootView.setOnScrollListener(new RecyclerView.OnScrollListener() { + + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + if (mZoomView != null && !isHideHeader() && isPullToZoomEnabled()) { + float f = mHeaderHeight - mHeaderContainer.getBottom(); + Log.d(TAG, "onScroll --> f = " + f); + if (isParallax()) { + if ((f > 0.0F) && (f < mHeaderHeight)) { + int i = (int) (0.65D * f); + mHeaderContainer.scrollTo(0, -i); + } else if (mHeaderContainer.getScrollY() != 0) { + mHeaderContainer.scrollTo(0, 0); + } + } + } + + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + + + } + }); + mScalingRunnable = new ScalingRunnable(); + } + + /** + * 是否显示headerView + * + * @param isHideHeader true: show false: hide + */ + @Override + public void setHideHeader(boolean isHideHeader) { + if (isHideHeader != isHideHeader()) { + super.setHideHeader(isHideHeader); + if (isHideHeader) { + removeHeaderView(); + } else { + updateHeaderView(); + } + } + } + + @Override + public void setHeaderView(View headerView) { + if (headerView != null) { + this.mHeaderView = headerView; + updateHeaderView(); + } + } + + @Override + public void setZoomView(View zoomView) { + if (zoomView != null) { + this.mZoomView = zoomView; + updateHeaderView(); + } + } + + /** + * 移除HeaderView + * 如果要兼容API 9,需要修改此处逻辑,API 11以下不支持动态添加header + */ + private void removeHeaderView() { + if (mHeaderContainer != null) { + if (mRootView != null && mRootView.getAdapter() != null) { + + RecyclerViewHeaderAdapter mAdapter = (RecyclerViewHeaderAdapter) mRootView.getAdapter(); + + if (mAdapter != null) { + + if (mAdapter.getHeader(0) != null) + mAdapter.removeHeaderView(mAdapter.getHeader(0)); + } + + } + } + } + + /** + * 更新HeaderView 先移除-->再添加zoomView、HeaderView -->然后添加到listView的head + * 如果要兼容API 9,需要修改此处逻辑,API 11以下不支持动态添加header + */ + private void updateHeaderView() { + if (mHeaderContainer != null) { + + if (mRootView != null && mRootView.getAdapter() != null) { + + RecyclerViewHeaderAdapter mAdapter = (RecyclerViewHeaderAdapter) mRootView.getAdapter(); + + if (mAdapter != null) { + + if (mAdapter.getHeader(0) != null) + mAdapter.removeHeaderView(mAdapter.getHeader(0)); + + mHeaderContainer.removeAllViews(); + + if (mZoomView != null) { + mHeaderContainer.addView(mZoomView); + } + + if (mHeaderView != null) { + mHeaderContainer.addView(mHeaderView); + } + + mHeaderHeight = mHeaderContainer.getHeight(); + + RecyclerViewHeaderAdapter.ExtraItem mExtraItem = new RecyclerViewHeaderAdapter.ExtraItem(RecyclerViewHeaderAdapter.INT_TYPE_HEADER, new RecyclerView.ViewHolder(mHeaderContainer) { + @Override + public String toString() { + return super.toString(); + } + }); + + mAdapter.addHeaderView(mExtraItem); + } + } + } + } + + public void setAdapterAndLayoutManager(RecyclerView.Adapter adapter, GridLayoutManager mLayoutManager) { + mRootView.setLayoutManager(mLayoutManager); + mRootView.setAdapter(adapter); + updateHeaderView(); + } + + public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { +// mRootView.setOnItemClickListener(listener); + } + + /** + * 创建listView 如果要兼容API9,需要修改此处 + * + * @param context 上下文 + * @param attrs AttributeSet + * @return ListView + */ + @Override + protected RecyclerView createRootView(Context context, AttributeSet attrs) { + RecyclerView rv = new RecyclerView(context, attrs); + // Set it to this so it can be used in ListActivity/ListFragment + +// rv.setId(android.R.id.list); + return rv; + } + + /** + * 重置动画,自动滑动到顶部 + */ + @Override + protected void smoothScrollToTop() { + Log.d(TAG, "smoothScrollToTop --> "); + mScalingRunnable.startAnimation(200L); + } + + /** + * zoomView动画逻辑 + * + * @param newScrollValue 手指Y轴移动距离值 + */ + @Override + protected void pullHeaderToZoom(int newScrollValue) { + Log.d(TAG, "pullHeaderToZoom --> newScrollValue = " + newScrollValue); + Log.d(TAG, "pullHeaderToZoom --> mHeaderHeight = " + mHeaderHeight); + if (mScalingRunnable != null && !mScalingRunnable.isFinished()) { + mScalingRunnable.abortAnimation(); + } + + ViewGroup.LayoutParams localLayoutParams = mHeaderContainer.getLayoutParams(); + localLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight; + mHeaderContainer.setLayoutParams(localLayoutParams); + } + + @Override + protected boolean isReadyForPullStart() { + return isFirstItemVisible(); + } + + private boolean isFirstItemVisible() { + if (mRootView != null) { + final RecyclerView.Adapter adapter = mRootView.getAdapter(); + final GridLayoutManager mLayoutmanager = (GridLayoutManager) mRootView.getLayoutManager(); + + + if (null == adapter || adapter.getItemCount() == 0) { + return true; + } else { + /** + * This check should really just be: + * mRootView.getFirstVisiblePosition() == 0, but PtRListView + * internally use a HeaderView which messes the positions up. For + * now we'll just add one to account for it and rely on the inner + * condition which checks getTop(). + */ + + int[] into = {0,0}; + if (mLayoutmanager != null) + into[0] = mLayoutmanager.findFirstVisibleItemPosition(); + if (into.length > 0 && into.length > 0 && into[0] <= 1) { + final View firstVisibleChild = mRootView.getChildAt(0); + if (firstVisibleChild != null) { + return firstVisibleChild.getTop() >= mRootView.getTop(); + } + } + } + } + + return false; + } + + @Override + public void handleStyledAttributes(TypedArray a) { + mHeaderContainer = new FrameLayout(getContext()); + if (mZoomView != null) { + mHeaderContainer.addView(mZoomView); + } + if (mHeaderView != null) { + mHeaderContainer.addView(mHeaderView); + } + RecyclerViewHeaderAdapter mAdapter = (RecyclerViewHeaderAdapter) mRootView.getAdapter(); + if (mAdapter != null) { + RecyclerViewHeaderAdapter.ExtraItem mExtraItem = new RecyclerViewHeaderAdapter.ExtraItem(RecyclerViewHeaderAdapter.INT_TYPE_HEADER, new RecyclerView.ViewHolder(mHeaderContainer) { + @Override + public String toString() { + return super.toString(); + } + }); + + mAdapter.addHeaderView(mExtraItem); + } + } + + /** + * 设置HeaderView高度 + * + * @param width 宽 + * @param height 高 + */ + public void setHeaderViewSize(int width, int height) { + if (mHeaderContainer != null) { + Object localObject = mHeaderContainer.getLayoutParams(); + if (localObject == null) { + localObject = new AbsListView.LayoutParams(width, height); + } + ((ViewGroup.LayoutParams) localObject).width = width; + ((ViewGroup.LayoutParams) localObject).height = height; + mHeaderContainer.setLayoutParams((ViewGroup.LayoutParams) localObject); + mHeaderHeight = height; + } + } + + public void setHeaderLayoutParams(AbsListView.LayoutParams layoutParams) { + if (mHeaderContainer != null) { + mHeaderContainer.setLayoutParams(layoutParams); + mHeaderHeight = layoutParams.height; + } + } + + protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, + int paramInt3, int paramInt4) { + super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4); + Log.d(TAG, "onLayout --> "); + if (mHeaderHeight == 0 && mHeaderContainer != null) { + mHeaderHeight = mHeaderContainer.getHeight(); + } + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + Log.d(TAG, "onScrollStateChanged --> "); + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (mZoomView != null && !isHideHeader() && isPullToZoomEnabled()) { + float f = mHeaderHeight - mHeaderContainer.getBottom(); + Log.d(TAG, "onScroll --> f = " + f); + if (isParallax()) { + if ((f > 0.0F) && (f < mHeaderHeight)) { + int i = (int) (0.65D * f); + mHeaderContainer.scrollTo(0, -i); + } else if (mHeaderContainer.getScrollY() != 0) { + mHeaderContainer.scrollTo(0, 0); + } + } + } + } + + + class ScalingRunnable implements Runnable { + protected long mDuration; + protected boolean mIsFinished = true; + protected float mScale; + protected long mStartTime; + + ScalingRunnable() { + } + + public void abortAnimation() { + mIsFinished = true; + } + + public boolean isFinished() { + return mIsFinished; + } + + public void run() { + if (mZoomView != null) { + float f2; + ViewGroup.LayoutParams localLayoutParams; + if ((!mIsFinished) && (mScale > 1.0D)) { + float f1 = ((float) SystemClock.currentThreadTimeMillis() - (float) mStartTime) / (float) mDuration; + f2 = mScale - (mScale - 1.0F) * PullToZoomRecyclerViewEx.sInterpolator.getInterpolation(f1); + localLayoutParams = mHeaderContainer.getLayoutParams(); + Log.d(TAG, "ScalingRunnable --> f2 = " + f2); + if (f2 > 1.0F) { + localLayoutParams.height = ((int) (f2 * mHeaderHeight)); + mHeaderContainer.setLayoutParams(localLayoutParams); + post(this); + return; + } + mIsFinished = true; + } + } + } + + public void startAnimation(long paramLong) { + if (mZoomView != null) { + mStartTime = SystemClock.currentThreadTimeMillis(); + mDuration = paramLong; + mScale = ((float) (mHeaderContainer.getBottom()) / mHeaderHeight); + mIsFinished = false; + post(this); + } + } + } +} diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomScrollActivity.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomScrollActivity.java index 4a1d0ea..cedcd7a 100644 --- a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomScrollActivity.java +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/PullToZoomScrollActivity.java @@ -1,6 +1,5 @@ package com.ecloud.pulltozoomview.demo; -import android.app.Activity; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.DisplayMetrics; @@ -9,10 +8,8 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; -import com.ecloud.pulltozoomview.PullToZoomScrollView; import com.ecloud.pulltozoomview.PullToZoomScrollViewEx; /** @@ -35,8 +32,23 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pull_to_zoom_scroll_view); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + loadViewForCode(); scrollView = (PullToZoomScrollViewEx) findViewById(R.id.scroll_view); - scrollView.getRootView().findViewById(R.id.tv_test1).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.tv_test1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e("zhuwenwu", "onClick -->"); + } + }); + + scrollView.getPullRootView().findViewById(R.id.tv_test2).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e("zhuwenwu", "onClick -->"); + } + }); + + scrollView.getPullRootView().findViewById(R.id.tv_test3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("zhuwenwu", "onClick -->"); @@ -78,7 +90,7 @@ else if (id == R.id.action_normal) { scrollView.setHideHeader(false); return true; } else if (id == R.id.action_hide_head) { -// scrollView.hideHeaderView(); +// scrollView.hideHeaderVie˛w(); scrollView.setHideHeader(true); return true; } else if (id == R.id.action_disable_zoom) { @@ -94,12 +106,12 @@ else if (id == R.id.action_normal) { } private void loadViewForCode() { - PullToZoomScrollView scrollView = (PullToZoomScrollView) findViewById(R.id.scroll_view); + PullToZoomScrollViewEx scrollView = (PullToZoomScrollViewEx) findViewById(R.id.scroll_view); View headView = LayoutInflater.from(this).inflate(R.layout.profile_head_view, null, false); View zoomView = LayoutInflater.from(this).inflate(R.layout.profile_zoom_view, null, false); View contentView = LayoutInflater.from(this).inflate(R.layout.profile_content_view, null, false); - scrollView.setHeaderContainer(headView); + scrollView.setHeaderView(headView); scrollView.setZoomView(zoomView); - scrollView.setContentContainerView(contentView); + scrollView.setScrollContentView(contentView); } } diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/PullToZoomRecyclerActivity.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/PullToZoomRecyclerActivity.java new file mode 100644 index 0000000..744928a --- /dev/null +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/PullToZoomRecyclerActivity.java @@ -0,0 +1,150 @@ +package com.ecloud.pulltozoomview.demo.recyclerview; + +import android.content.Context; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.TextView; + +import com.ecloud.pulltozoomview.demo.PullToZoomRecyclerViewEx; +import com.ecloud.pulltozoomview.demo.R; + +/** + * Created by manishdeora on 13/05/15. + */ +public class PullToZoomRecyclerActivity extends ActionBarActivity { + private PullToZoomRecyclerViewEx listView; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + setContentView(R.layout.activity_pull_to_zoom_recycler_view); + + listView = (PullToZoomRecyclerViewEx) findViewById(R.id.recyclerview); + + + final RecyclerViewHeaderAdapter mAdapter = new RecyclerAdapterCustom(this); + + final GridLayoutManager manager = new GridLayoutManager(this, 2); + manager.setOrientation(GridLayoutManager.VERTICAL); + manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + return mAdapter.getItemViewType(position) == RecyclerViewHeaderAdapter.INT_TYPE_HEADER ? 2 : 1; + } + }); + listView.setAdapterAndLayoutManager(mAdapter, manager); + + + DisplayMetrics localDisplayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics); + int mScreenHeight = localDisplayMetrics.heightPixels; + int mScreenWidth = localDisplayMetrics.widthPixels; + AbsListView.LayoutParams localObject = new AbsListView.LayoutParams(mScreenWidth, (int) (9.0F * (mScreenWidth / 16.0F))); + listView.setHeaderLayoutParams(localObject); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.list_view, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + finish(); + return true; + } else if (id == R.id.action_normal) { + listView.setParallax(false); + return true; + } else if (id == R.id.action_parallax) { + listView.setParallax(true); + return true; + } else if (id == R.id.action_show_head) { + listView.setHideHeader(false); + return true; + } else if (id == R.id.action_hide_head) { + listView.setHideHeader(true); + return true; + } else if (id == R.id.action_disable_zoom) { + listView.setZoomEnabled(false); + return true; + } else if (id == R.id.action_enable_zoom) { + listView.setZoomEnabled(true); + return true; + } + return super.onOptionsItemSelected(item); + } + + + public class RecyclerAdapterCustom extends RecyclerViewHeaderAdapter { + final String[] adapterData = new String[]{"Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", + "DDMS", "Android Studio", "Fragment", "Loader", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient", "Activity", "Service", "Content Provider", "Intent", + "BroadcastReceiver", "ADT", "Sqlite3", "HttpClient"}; + + public RecyclerAdapterCustom(Context context) { + super(context); + } + + @Override + public int getCount() { + return adapterData.length; + } + + @Override + public ViewHolderRecyclerPullToZoom onCreateContentView(ViewGroup parent, int viewType) { + return new ViewHolderRecyclerPullToZoom(new TextView(getContext())); + } + + @Override + public void onBindView(ViewHolderRecyclerPullToZoom view, int position) { + + view.mtextview.setText(adapterData[position]); + +// final StaggeredGridLayoutManager.LayoutParams lp = +// (StaggeredGridLayoutManager.LayoutParams) view.mtextview.getLayoutParams(); +//// +// lp.span = span; +// lp.height = size; +// itemView.setLayoutParams(lp); + + + } + } + + public static class ViewHolderRecyclerPullToZoom extends RecyclerView.ViewHolder { + + TextView mtextview; + + public ViewHolderRecyclerPullToZoom(View itemView) { + super(itemView); + + mtextview = (TextView) itemView; + } + } +} \ No newline at end of file diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/RecyclerViewHeaderAdapter.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/RecyclerViewHeaderAdapter.java new file mode 100644 index 0000000..828dd6e --- /dev/null +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/RecyclerViewHeaderAdapter.java @@ -0,0 +1,195 @@ +/* + * Created by Krishan Patel. + * Copyright (c) 2014. Rocko Labs Ltd. All Rights Reserved. + */ + +package com.ecloud.pulltozoomview.demo.recyclerview; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +public abstract class RecyclerViewHeaderAdapter extends RecyclerView.Adapter { + public static final int INT_TYPE_HEADER = 0; + public static final int INT_TYPE_FOOTER = 1; + + public static class ExtraItem { + public final int type; + public final V view; + + public ExtraItem(int type, V view) { + this.type = type; + this.view = view; + } + + } + + private View emptyView; + + private final Context context; + private final List headers; + private final List footers; + + public RecyclerViewHeaderAdapter(Context context) { + this.context = context; + this.headers = new ArrayList(); + this.footers = new ArrayList(); + } + + public Context getContext() { + return context; + } + + public void setEmptyView(View emptyView) { + this.emptyView = emptyView; + emptyView.setVisibility(getCount() == 0 ? View.VISIBLE : View.GONE); + } + + public abstract int getCount(); + + @Override + public final int getItemCount() { + int count = headers.size(); + count += getCount(); + count += footers.size(); + + if (emptyView != null) + emptyView.setVisibility(getCount() == 0 ? View.VISIBLE : View.GONE); + + return count; + } + + public ExtraItem addHeaderView(int type, V headerView) { + ExtraItem item = new ExtraItem(type, headerView); + addHeaderView(item); + return item; + } + + public void addHeaderView(ExtraItem headerView) { + headers.add(headerView); + notifyItemInserted(headers.size()); + } + + public void removeHeaderView(int type) { + List indexesToRemove = new ArrayList(); + for (int i = 0; i < headers.size(); i++) { + ExtraItem item = headers.get(i); + if (item.type == type) + indexesToRemove.add(item); + } + + for (ExtraItem item : indexesToRemove) { + int index = headers.indexOf(item); + headers.remove(item); + notifyItemRemoved(index); + } + } + + public void removeHeaderView(ExtraItem headerView) { + int indexToRemove = headers.indexOf(headerView); + if (indexToRemove >= 0) { + headers.remove(indexToRemove); + notifyItemRemoved(indexToRemove); + } + } + + public ExtraItem addFooterView(int type, V footerView) { + ExtraItem item = new ExtraItem(type, footerView); + addFooterView(item); + return item; + } + + public void addFooterView(ExtraItem footerView) { + footers.add(footerView); + notifyItemInserted(getItemCount()); + } + + public void removeFooterView(int type) { + List indexesToRemove = new ArrayList(); + for (int i = 0; i < footers.size(); i++) { + ExtraItem item = footers.get(i); + if (item.type == type) + indexesToRemove.add(item); + } + + for (ExtraItem item : indexesToRemove) { + int index = footers.indexOf(item); + footers.remove(item); + notifyItemRemoved(headers.size() + getCount() + index); + } + } + + public void removeFooterView(ExtraItem footerView) { + int indexToRemove = footers.indexOf(footerView); + if (indexToRemove >= 0) { + footers.remove(indexToRemove); + notifyItemRemoved(headers.size() + getCount() + indexToRemove); + } + } + + public int getViewType(int position) { + return super.getItemViewType(position); + } + + + public ExtraItem getHeader(int mIntArgHeaderPos) { + + if (headers != null && headers.size() > mIntArgHeaderPos) { + return headers.get(mIntArgHeaderPos); + } + return null; + } + + @Override + public final int getItemViewType(int position) { + if (position < headers.size()) + return INT_TYPE_HEADER; + else + return INT_TYPE_FOOTER; +// return getViewType(position - headers.size()); + } + + @Override + public final V onCreateViewHolder(ViewGroup parent, int viewType) { + for (ExtraItem item : headers) + if (viewType == item.type) + return item.view; + + for (ExtraItem item : footers) + if (viewType == item.type) + return item.view; + + return onCreateContentView(parent, viewType); + } + + public abstract V onCreateContentView(ViewGroup parent, int viewType); + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (position >= headers.size() && (position - headers.size()) < getCount()) { + //noinspection unchecked + onBindView((V) holder, position - headers.size()); + } else { + + try { + final StaggeredGridLayoutManager.LayoutParams lp = + (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams(); +// + lp.setFullSpan(true); + ; + + holder.itemView.setLayoutParams(lp); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public abstract void onBindView(V view, int position); + +} \ No newline at end of file diff --git a/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/SpannableStaggeredGridLayoutManager.java b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/SpannableStaggeredGridLayoutManager.java new file mode 100644 index 0000000..7943981 --- /dev/null +++ b/PullToZoomView/app/src/main/java/com/ecloud/pulltozoomview/demo/recyclerview/SpannableStaggeredGridLayoutManager.java @@ -0,0 +1,15 @@ +package com.ecloud.pulltozoomview.demo.recyclerview; + +import android.support.v7.widget.RecyclerView; + +/** + * Created by manishdeora on 14/05/15. + */ +public class SpannableStaggeredGridLayoutManager extends RecyclerView.LayoutManager{ + + + @Override + public RecyclerView.LayoutParams generateDefaultLayoutParams() { + return null; + } +} diff --git a/PullToZoomView/app/src/main/res/layout/activity_main.xml b/PullToZoomView/app/src/main/res/layout/activity_main.xml index 6696eb3..9e23686 100644 --- a/PullToZoomView/app/src/main/res/layout/activity_main.xml +++ b/PullToZoomView/app/src/main/res/layout/activity_main.xml @@ -1,33 +1,48 @@ -