diff --git a/library/src/main/java/com/cleveroad/adaptivetablelayout/AdaptiveTableLayout.java b/library/src/main/java/com/cleveroad/adaptivetablelayout/AdaptiveTableLayout.java index 881eb7d..6feb173 100644 --- a/library/src/main/java/com/cleveroad/adaptivetablelayout/AdaptiveTableLayout.java +++ b/library/src/main/java/com/cleveroad/adaptivetablelayout/AdaptiveTableLayout.java @@ -114,6 +114,7 @@ public class AdaptiveTableLayout extends ViewGroup implements ScrollHelper.Scrol */ @Nullable private TableInstanceSaver mSaver; + private boolean hasData= false; public AdaptiveTableLayout(Context context) { super(context); @@ -304,6 +305,7 @@ public void setAdapter(@Nullable AdaptiveTableAdapter adapter) { // register notify callbacks mAdapter.registerDataSetObserver(this); adapter.registerDataSetObserver(new DataSetObserverProxy(mAdapter)); + hasData= adapter.getColumnCount() >0 && adapter.getRowCount() >0; } else { // remove adapter mAdapter = null; @@ -333,6 +335,7 @@ public void setAdapter(@Nullable DataAdaptiveTableLayoutAdapter adapter) { mAdapter = adapter; if (mAdapter != null) { + hasData= adapter.getColumnCount() >0 && adapter.getRowCount() >0; mAdapter.registerDataSetObserver(this); } @@ -375,64 +378,67 @@ public void scrollTo(int x, int y) { @Override public void scrollBy(int x, int y) { // block scroll one axle - int tempX = mState.isRowDragging() ? 0 : x; - int tempY = mState.isColumnDragging() ? 0 : y; - - int diffX = tempX; - int diffY = tempY; - - int shadowShiftX = mManager.getColumnCount() * mSettings.getCellMargin(); - int shadowShiftY = mManager.getRowCount() * mSettings.getCellMargin(); - - long maxX = mManager.getFullWidth() + shadowShiftX; - long maxY = mManager.getFullHeight() + shadowShiftY; - - if (mState.getScrollX() + tempX <= 0) { - // scroll over view to the left - diffX = mState.getScrollX(); - mState.setScrollX(0); - } else if (mSettings.getLayoutWidth() > maxX) { - // few items and we have free space. - diffX = 0; - mState.setScrollX(0); - } else if (mState.getScrollX() + mSettings.getLayoutWidth() + tempX > maxX) { - // scroll over view to the right - diffX = (int) (maxX - mState.getScrollX() - mSettings.getLayoutWidth()); - - mState.setScrollX(mState.getScrollX() + diffX); - } else { - mState.setScrollX(mState.getScrollX() + tempX); - } - - if (mState.getScrollY() + tempY <= 0) { - // scroll over view to the top - diffY = mState.getScrollY(); - mState.setScrollY(0); - } else if (mSettings.getLayoutHeight() > maxY) { - // few items and we have free space. - diffY = 0; - mState.setScrollY(0); - } else if (mState.getScrollY() + mSettings.getLayoutHeight() + tempY > maxY) { - // scroll over view to the bottom - diffY = (int) (maxY - mState.getScrollY() - mSettings.getLayoutHeight()); - mState.setScrollY(mState.getScrollY() + diffY); - } else { - mState.setScrollY(mState.getScrollY() + tempY); - } + if(hasDataApter()) { - if (diffX == 0 && diffY == 0) { - return; - } + int tempX = mState.isRowDragging() ? 0 : x; + int tempY = mState.isColumnDragging() ? 0 : y; - if (mAdapter != null) { - // refresh views - recycleViewHolders(); - mVisibleArea.set(mState.getScrollX(), - mState.getScrollY(), - mState.getScrollX() + mSettings.getLayoutWidth(), - mState.getScrollY() + mSettings.getLayoutHeight()); - addViewHolders(mVisibleArea); - refreshViewHolders(); + int diffX = tempX; + int diffY = tempY; + + int shadowShiftX = mManager.getColumnCount() * mSettings.getCellMargin(); + int shadowShiftY = mManager.getRowCount() * mSettings.getCellMargin(); + + long maxX = mManager.getFullWidth() + shadowShiftX; + long maxY = mManager.getFullHeight() + shadowShiftY; + + if (mState.getScrollX() + tempX <= 0) { + // scroll over view to the left + diffX = mState.getScrollX(); + mState.setScrollX(0); + } else if (mSettings.getLayoutWidth() > maxX) { + // few items and we have free space. + diffX = 0; + mState.setScrollX(0); + } else if (mState.getScrollX() + mSettings.getLayoutWidth() + tempX > maxX) { + // scroll over view to the right + diffX = (int) (maxX - mState.getScrollX() - mSettings.getLayoutWidth()); + + mState.setScrollX(mState.getScrollX() + diffX); + } else { + mState.setScrollX(mState.getScrollX() + tempX); + } + + if (mState.getScrollY() + tempY <= 0) { + // scroll over view to the top + diffY = mState.getScrollY(); + mState.setScrollY(0); + } else if (mSettings.getLayoutHeight() > maxY) { + // few items and we have free space. + diffY = 0; + mState.setScrollY(0); + } else if (mState.getScrollY() + mSettings.getLayoutHeight() + tempY > maxY) { + // scroll over view to the bottom + diffY = (int) (maxY - mState.getScrollY() - mSettings.getLayoutHeight()); + mState.setScrollY(mState.getScrollY() + diffY); + } else { + mState.setScrollY(mState.getScrollY() + tempY); + } + + if (diffX == 0 && diffY == 0) { + return; + } + + if (mAdapter != null) { + // refresh views + recycleViewHolders(); + mVisibleArea.set(mState.getScrollX(), + mState.getScrollY(), + mState.getScrollX() + mSettings.getLayoutWidth(), + mState.getScrollY() + mSettings.getLayoutHeight()); + addViewHolders(mVisibleArea); + refreshViewHolders(); + } } } @@ -1383,18 +1389,20 @@ public boolean onDown(MotionEvent e) { @Override public boolean onSingleTapUp(MotionEvent e) { // simple click event - ViewHolder viewHolder = getViewHolderByPosition((int) e.getX(), (int) e.getY()); - if (viewHolder != null) { - OnItemClickListener onItemClickListener = mAdapter.getOnItemClickListener(); - if (onItemClickListener != null) { - if (viewHolder.getItemType() == ViewHolderType.ITEM) { - onItemClickListener.onItemClick(viewHolder.getRowIndex(), getBindColumn(viewHolder.getColumnIndex())); - } else if (viewHolder.getItemType() == ViewHolderType.ROW_HEADER) { - onItemClickListener.onRowHeaderClick(viewHolder.getRowIndex()); - } else if (viewHolder.getItemType() == ViewHolderType.COLUMN_HEADER) { - onItemClickListener.onColumnHeaderClick(getBindColumn(viewHolder.getColumnIndex())); - } else { - onItemClickListener.onLeftTopHeaderClick(); + if(hasDataApter()) { + ViewHolder viewHolder = getViewHolderByPosition((int) e.getX(), (int) e.getY()); + if (viewHolder != null) { + OnItemClickListener onItemClickListener = mAdapter.getOnItemClickListener(); + if (onItemClickListener != null) { + if (viewHolder.getItemType() == ViewHolderType.ITEM) { + onItemClickListener.onItemClick(viewHolder.getRowIndex(), getBindColumn(viewHolder.getColumnIndex())); + } else if (viewHolder.getItemType() == ViewHolderType.ROW_HEADER) { + onItemClickListener.onRowHeaderClick(viewHolder.getRowIndex()); + } else if (viewHolder.getItemType() == ViewHolderType.COLUMN_HEADER) { + onItemClickListener.onColumnHeaderClick(getBindColumn(viewHolder.getColumnIndex())); + } else { + onItemClickListener.onLeftTopHeaderClick(); + } } } } @@ -1405,60 +1413,68 @@ public boolean onSingleTapUp(MotionEvent e) { public void onLongPress(MotionEvent e) { // prepare drag and drop // search view holder by x, y - ViewHolder viewHolder = getViewHolderByPosition((int) e.getX(), (int) e.getY()); - if (viewHolder != null) { + if(hasDataApter()) { + ViewHolder viewHolder = getViewHolderByPosition((int) e.getX(), (int) e.getY()); + if (viewHolder != null) { - if (!mSettings.isDragAndDropEnabled()) { - checkLongPressForItemAndFirstHeader(viewHolder); - return; - } - // save start dragging touch position - mDragAndDropPoints.setStart((int) (mState.getScrollX() + e.getX()), (int) (mState.getScrollY() + e.getY())); - if (viewHolder.getItemType() == ViewHolderType.COLUMN_HEADER) { - // dragging column header - mState.setRowDragging(false, viewHolder.getRowIndex()); - mState.setColumnDragging(true, viewHolder.getColumnIndex()); + if (!mSettings.isDragAndDropEnabled()) { + checkLongPressForItemAndFirstHeader(viewHolder); + return; + } + // save start dragging touch position + mDragAndDropPoints.setStart((int) (mState.getScrollX() + e.getX()), (int) (mState.getScrollY() + e.getY())); + if (viewHolder.getItemType() == ViewHolderType.COLUMN_HEADER) { + // dragging column header + mState.setRowDragging(false, viewHolder.getRowIndex()); + mState.setColumnDragging(true, viewHolder.getColumnIndex()); - // set dragging flags to column's view holder - setDraggingToColumn(viewHolder.getColumnIndex(), true); + // set dragging flags to column's view holder + setDraggingToColumn(viewHolder.getColumnIndex(), true); - mShadowHelper.removeColumnsHeadersShadow(this); + mShadowHelper.removeColumnsHeadersShadow(this); - mShadowHelper.addLeftShadow(this); - mShadowHelper.addRightShadow(this); + mShadowHelper.addLeftShadow(this); + mShadowHelper.addRightShadow(this); - // update view - refreshViewHolders(); + // update view + refreshViewHolders(); - } else if (viewHolder.getItemType() == ViewHolderType.ROW_HEADER) { - // dragging column header - mState.setRowDragging(true, viewHolder.getRowIndex()); - mState.setColumnDragging(false, viewHolder.getColumnIndex()); + } else if (viewHolder.getItemType() == ViewHolderType.ROW_HEADER) { + // dragging column header + mState.setRowDragging(true, viewHolder.getRowIndex()); + mState.setColumnDragging(false, viewHolder.getColumnIndex()); - // set dragging flags to row's view holder - setDraggingToRow(viewHolder.getRowIndex(), true); + // set dragging flags to row's view holder + setDraggingToRow(viewHolder.getRowIndex(), true); - mShadowHelper.removeRowsHeadersShadow(this); + mShadowHelper.removeRowsHeadersShadow(this); - mShadowHelper.addTopShadow(this); - mShadowHelper.addBottomShadow(this); + mShadowHelper.addTopShadow(this); + mShadowHelper.addBottomShadow(this); - // update view - refreshViewHolders(); + // update view + refreshViewHolders(); - } else { - checkLongPressForItemAndFirstHeader(viewHolder); + } else { + checkLongPressForItemAndFirstHeader(viewHolder); + } } } } + private boolean hasDataApter() { + return hasData; + } + private void checkLongPressForItemAndFirstHeader(ViewHolder viewHolder) { - OnItemLongClickListener onItemClickListener = mAdapter.getOnItemLongClickListener(); - if (onItemClickListener != null) { - if (viewHolder.getItemType() == ViewHolderType.ITEM) { - onItemClickListener.onItemLongClick(viewHolder.getRowIndex(), viewHolder.getColumnIndex()); - } else if (viewHolder.getItemType() == ViewHolderType.FIRST_HEADER) { - onItemClickListener.onLeftTopHeaderLongClick(); + if(hasDataApter()) { + OnItemLongClickListener onItemClickListener = mAdapter.getOnItemLongClickListener(); + if (onItemClickListener != null) { + if (viewHolder.getItemType() == ViewHolderType.ITEM) { + onItemClickListener.onItemLongClick(viewHolder.getRowIndex(), viewHolder.getColumnIndex()); + } else if (viewHolder.getItemType() == ViewHolderType.FIRST_HEADER) { + onItemClickListener.onLeftTopHeaderLongClick(); + } } } } @@ -1613,7 +1629,7 @@ private ViewHolder getViewHolderByPosition(int x, int y) { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - if (!mState.isDragging()) { + if (!mState.isDragging() && hasDataApter()) { // simple scroll.... if (!mScrollerRunnable.isFinished()) { mScrollerRunnable.forceFinished(); @@ -1625,7 +1641,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - if (!mState.isDragging()) { + if (!mState.isDragging() && hasDataApter()) { // simple fling mScrollerRunnable.start( mState.getScrollX(), mState.getScrollY(), diff --git a/sample/build.gradle b/sample/build.gradle index bfb661b..bf5fd95 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -30,4 +30,5 @@ dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' compile project(':library') + compile 'com.android.support.constraint:constraint-layout:1.0.2' } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 29ae63f..8750f6d 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -1,27 +1,28 @@ + + package="com.cleveroad.sample"> - - - + + + - - - - - - + + + + + - + \ No newline at end of file diff --git a/sample/src/main/java/com/cleveroad/sample/SampleApplication.java b/sample/src/main/java/com/cleveroad/sample/SampleApplication.java index fcf7e9d..c6e2070 100644 --- a/sample/src/main/java/com/cleveroad/sample/SampleApplication.java +++ b/sample/src/main/java/com/cleveroad/sample/SampleApplication.java @@ -9,6 +9,6 @@ public class SampleApplication extends Application { @Override public void onCreate() { super.onCreate(); - AppEventsLogger.activateApp(this); + // AppEventsLogger.activateApp(this); } } diff --git a/sample/src/main/java/com/cleveroad/sample/ui/Activity.java b/sample/src/main/java/com/cleveroad/sample/ui/Activity.java new file mode 100644 index 0000000..165e844 --- /dev/null +++ b/sample/src/main/java/com/cleveroad/sample/ui/Activity.java @@ -0,0 +1,15 @@ +package com.cleveroad.sample.ui; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import com.cleveroad.sample.R; + +public class Activity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_); + } +} diff --git a/sample/src/main/java/com/cleveroad/sample/ui/SampleActivity.java b/sample/src/main/java/com/cleveroad/sample/ui/SampleActivity.java index 9e814db..7708ea9 100644 --- a/sample/src/main/java/com/cleveroad/sample/ui/SampleActivity.java +++ b/sample/src/main/java/com/cleveroad/sample/ui/SampleActivity.java @@ -16,12 +16,12 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sample); - if (savedInstanceState == null) { - getSupportFragmentManager() - .beginTransaction() - .add(R.id.container, CsvPickerFragment.newInstance(), CsvPickerFragment.class.getSimpleName()) - .commit(); - } +// if (savedInstanceState == null) { +// getSupportFragmentManager() +// .beginTransaction() +// .add(R.id.container, CsvPickerFragment.newInstance(), CsvPickerFragment.class.getSimpleName()) +// .commit(); +// } } @Override @@ -29,11 +29,11 @@ public void onCsvFileSelected(String fileName) { if (fileName != null && !fileName.isEmpty()) { File file = new File(fileName); if (file.exists() && fileName.endsWith(".csv")) { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.container, TableLayoutFragment.newInstance(fileName), CsvPickerFragment.class.getSimpleName()) - .addToBackStack(CsvPickerFragment.class.getSimpleName()) - .commit(); +// getSupportFragmentManager() +// .beginTransaction() +// .replace(R.id.container, TableLayoutFragment.newInstance(fileName), CsvPickerFragment.class.getSimpleName()) +// .addToBackStack(CsvPickerFragment.class.getSimpleName()) +// .commit(); } else { Toast.makeText(this, R.string.not_csv_file_error, Toast.LENGTH_SHORT).show(); } diff --git a/sample/src/main/res/layout/activity_.xml b/sample/src/main/res/layout/activity_.xml new file mode 100644 index 0000000..4308153 --- /dev/null +++ b/sample/src/main/res/layout/activity_.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/sample/src/main/res/layout/activity_sample.xml b/sample/src/main/res/layout/activity_sample.xml index 876ee1c..8475589 100644 --- a/sample/src/main/res/layout/activity_sample.xml +++ b/sample/src/main/res/layout/activity_sample.xml @@ -7,9 +7,13 @@ android:background="@color/medium_jungle_green" android:focusableInTouchMode="true"> - - + android:layout_height="match_parent" + android:layout_below="@+id/toolbar" + app:cellMargin="1dp" + app:dragAndDropEnabled="true" + app:fixedHeaders="true" + app:solidRowHeaders="true"/>