@@ -105,6 +105,8 @@ public class AdaptiveTableLayout extends ViewGroup implements ScrollHelper.Scrol
105
105
*/
106
106
private ShadowHelper mShadowHelper ;
107
107
108
+ private int mLayoutDirection ;
109
+
108
110
/**
109
111
* Instant state
110
112
*/
@@ -139,12 +141,14 @@ public AdaptiveTableLayout(Context context, AttributeSet attrs, int defStyleAttr
139
141
* @return true if layout direction is RightToLeft
140
142
*/
141
143
public boolean isRTL () {
142
- return LayoutDirectionHelper .isRTL (this );
144
+ return LayoutDirectionHelper .isRTL ();
143
145
}
144
146
145
147
@ Override
146
148
public void setLayoutDirection (int layoutDirection ) {
147
149
super .setLayoutDirection (layoutDirection );
150
+ LayoutDirectionHelper .setLayoutDirection (layoutDirection );
151
+ mLayoutDirection = layoutDirection ;
148
152
mShadowHelper .onLayoutDirectionChanged ();
149
153
}
150
154
@@ -203,6 +207,7 @@ protected Parcelable onSaveInstanceState() {
203
207
mSaver = new TableInstanceSaver ();
204
208
mSaver .mScrollX = mState .getScrollX ();
205
209
mSaver .mScrollY = mState .getScrollY ();
210
+ mSaver .mLayoutDirection = mLayoutDirection ;
206
211
if (mAdapter != null ) {
207
212
mAdapter .onSaveInstanceState (bundle );
208
213
}
@@ -264,10 +269,11 @@ private void initItems() {
264
269
mState .getScrollY () + mSettings .getLayoutHeight ());
265
270
addViewHolders (mVisibleArea );
266
271
if (mSaver != null ) {
272
+ setLayoutDirection (mSaver .mLayoutDirection );
267
273
scrollTo (mSaver .mScrollX , mSaver .mScrollY );
268
274
mSaver = null ;
269
275
} else if (isRTL ()) {
270
- scrollTo (( int ) mManager . getFullWidth (), 0 );
276
+ scrollTo (mSettings . getLayoutWidth (), 0 );
271
277
}
272
278
}
273
279
@@ -365,7 +371,7 @@ public void scrollTo(int x, int y) {
365
371
long maxX = mManager .getFullWidth () + shadowShiftX ;
366
372
long maxY = mManager .getFullHeight () + shadowShiftY ;
367
373
368
- if (x < 0 ) {
374
+ if (x <= 0 ) {
369
375
// scroll over view to the left
370
376
absoluteX = 0 ;
371
377
} else if (mSettings .getLayoutWidth () + x > maxX ) {
@@ -375,7 +381,7 @@ public void scrollTo(int x, int y) {
375
381
376
382
mState .setScrollX (absoluteX );
377
383
378
- if (y < 0 ) {
384
+ if (y <= 0 ) {
379
385
// scroll over view to the top
380
386
absoluteY = 0 ;
381
387
} else if (mSettings .getLayoutHeight () + absoluteY > maxY ) {
@@ -411,7 +417,7 @@ public void scrollBy(int x, int y) {
411
417
long maxX = mManager .getFullWidth () + shadowShiftX ;
412
418
long maxY = mManager .getFullHeight () + shadowShiftY ;
413
419
414
- if (mState .getScrollX () + tempX < 0 ) {
420
+ if (mState .getScrollX () + tempX <= 0 ) {
415
421
// scroll over view to the left
416
422
diffX = mState .getScrollX ();
417
423
mState .setScrollX (0 );
@@ -428,7 +434,7 @@ public void scrollBy(int x, int y) {
428
434
mState .setScrollX (mState .getScrollX () + tempX );
429
435
}
430
436
431
- if (mState .getScrollY () + tempY < 0 ) {
437
+ if (mState .getScrollY () + tempY <= 0 ) {
432
438
// scroll over view to the top
433
439
diffY = mState .getScrollY ();
434
440
mState .setScrollY (0 );
@@ -525,6 +531,11 @@ private void refreshItemViewHolder(@NonNull ViewHolder holder,
525
531
boolean isRowDragging , boolean isColumnDragging ) {
526
532
527
533
int left = mManager .getColumnsWidth (0 , Math .max (0 , holder .getColumnIndex ()));
534
+ if (isRTL () && mManager .getFullWidth () <= mSettings .getLayoutWidth ()) {
535
+ left = getRowHeaderStartX ()
536
+ - (mManager .getColumnsWidthRtl (mManager .getColumnCount () - 1 , Math .max (0 , holder .getColumnIndex ()))
537
+ + mSettings .getCellMargin ());
538
+ }
528
539
int top = mManager .getRowsHeight (0 , Math .max (0 , holder .getRowIndex ()));
529
540
View view = holder .getItemView ();
530
541
if (isColumnDragging && holder .isDragging () && mDragAndDropPoints .getOffset ().x > 0 ) {
@@ -541,12 +552,13 @@ private void refreshItemViewHolder(@NonNull ViewHolder holder,
541
552
}
542
553
int leftMargin = holder .getColumnIndex () * mSettings .getCellMargin () + mSettings .getCellMargin ();
543
554
int topMargin = holder .getRowIndex () * mSettings .getCellMargin () + mSettings .getCellMargin ();
555
+ if (!isRTL ()) {
556
+ left += mManager .getHeaderRowWidth ();
557
+ }
544
558
545
559
// calculate view layout positions
546
560
int viewPosLeft = left - mState .getScrollX () + leftMargin ;
547
- if (!isRTL ()) {
548
- viewPosLeft += mManager .getHeaderRowWidth ();
549
- }
561
+
550
562
int viewPosRight = viewPosLeft + mManager .getColumnWidth (holder .getColumnIndex ());
551
563
int viewPosTop = top - mState .getScrollY () + mManager .getHeaderColumnHeight () + topMargin ;
552
564
int viewPosBottom = viewPosTop + mManager .getRowHeight (holder .getRowIndex ());
@@ -574,6 +586,9 @@ private void refreshHeaderColumnViewHolder(ViewHolder holder) {
574
586
int left = mManager .getColumnsWidth (0 , Math .max (0 , holder .getColumnIndex ()));
575
587
if (!isRTL ()) {
576
588
left += mManager .getHeaderRowWidth ();
589
+ } else if (isRTL () && mManager .getFullWidth () <= mSettings .getLayoutWidth ()) {
590
+ left = getRowHeaderStartX () - (mManager .getColumnsWidthRtl (mManager .getColumnCount () - 1 ,
591
+ holder .getColumnIndex ()) + mSettings .getCellMargin ());
577
592
}
578
593
579
594
int top = mSettings .isHeaderFixed () ? 0 : -mState .getScrollY ();
@@ -653,8 +668,9 @@ private void refreshHeaderColumnViewHolder(ViewHolder holder) {
653
668
private void refreshHeaderRowViewHolder (ViewHolder holder ) {
654
669
int top = mManager .getRowsHeight (0 , Math .max (0 , holder .getRowIndex ())) + mManager .getHeaderColumnHeight ();
655
670
int left = calculateRowHeadersLeft ();
656
- if (isRTL ())
671
+ if (isRTL ()) {
657
672
left += mSettings .getCellMargin ();
673
+ }
658
674
View view = holder .getItemView ();
659
675
660
676
int leftMargin = holder .getColumnIndex () * mSettings .getCellMargin () + mSettings .getCellMargin ();
@@ -754,9 +770,13 @@ private int calculateRowHeadersLeft() {
754
770
if (!isRTL ()) {
755
771
left = -mState .getScrollX ();
756
772
} else {
757
- left = -mState .getScrollX ()
758
- + (int ) (mManager .getFullWidth () - mManager .getHeaderRowWidth ())
759
- + mManager .getColumnCount () * mSettings .getCellMargin ();
773
+ if (mManager .getFullWidth () <= mSettings .getLayoutWidth ()) {
774
+ left = -mState .getScrollX () + getRowHeaderStartX ();
775
+ } else {
776
+ left = -mState .getScrollX ()
777
+ + (int ) (mManager .getFullWidth () - mManager .getHeaderRowWidth ())
778
+ + mManager .getColumnCount () * mSettings .getCellMargin ();
779
+ }
760
780
}
761
781
}
762
782
return left ;
@@ -798,6 +818,9 @@ private void recycleViewHolders(boolean isRecycleAll) {
798
818
}
799
819
}
800
820
}
821
+ if (!headerKeysToRemove .isEmpty ()) {
822
+ headerKeysToRemove .clear ();
823
+ }
801
824
// column header view holders
802
825
for (int count = mHeaderColumnViewHolders .size (), i = 0 ; i < count ; i ++) {
803
826
int key = mHeaderColumnViewHolders .keyAt (i );
@@ -817,6 +840,9 @@ private void recycleViewHolders(boolean isRecycleAll) {
817
840
818
841
removeKeys (headerKeysToRemove , mHeaderColumnViewHolders );
819
842
843
+ if (!headerKeysToRemove .isEmpty ()) {
844
+ headerKeysToRemove .clear ();
845
+ }
820
846
// row header view holders
821
847
for (int count = mHeaderRowViewHolders .size (), i = 0 ; i < count ; i ++) {
822
848
int key = mHeaderRowViewHolders .keyAt (i );
@@ -861,6 +887,15 @@ private void recycleViewHolder(ViewHolder holder) {
861
887
mAdapter .onViewHolderRecycled (holder );
862
888
}
863
889
890
+
891
+ private int getEmptySpace () {
892
+ if (isRTL () && mSettings .getLayoutWidth () > mManager .getFullWidth ()) {
893
+ return mSettings .getLayoutWidth () - (int ) mManager .getFullWidth ();
894
+ } else {
895
+ return 0 ;
896
+ }
897
+ }
898
+
864
899
/**
865
900
* Create and add view holders with views to the layout.
866
901
*
@@ -1049,7 +1084,7 @@ public boolean onTouchEvent(MotionEvent event) {
1049
1084
return mScrollHelper .onTouch (event );
1050
1085
}
1051
1086
// calculate absolute x, y
1052
- int absoluteX = (int ) (mState .getScrollX () + event .getX ());
1087
+ int absoluteX = (int ) (mState .getScrollX () + event .getX ()) - getEmptySpace () ;
1053
1088
int absoluteY = (int ) (mState .getScrollY () + event .getY ());
1054
1089
1055
1090
// if column drag and drop mode and column offset > SHIFT_VIEWS_THRESHOLD
@@ -1062,8 +1097,9 @@ public boolean onTouchEvent(MotionEvent event) {
1062
1097
if (fromColumn != toColumn ) {
1063
1098
int columnWidth = mManager .getColumnWidth (toColumn );
1064
1099
int absoluteColumnX = mManager .getColumnsWidth (0 , toColumn );
1065
- if (!isRTL ())
1100
+ if (!isRTL ()) {
1066
1101
absoluteColumnX += mManager .getHeaderRowWidth ();
1102
+ }
1067
1103
1068
1104
if (fromColumn < toColumn ) {
1069
1105
// left column is dragging one
@@ -1327,6 +1363,7 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
1327
1363
int itemsAndColumnsLeft = !isRTL ()
1328
1364
? Math .max (0 , mManager .getHeaderRowWidth () - headerFixedX )
1329
1365
: 0 ;
1366
+
1330
1367
int itemsAndColumnsRight = mSettings .getLayoutWidth ();
1331
1368
if (isRTL ()) {
1332
1369
itemsAndColumnsRight += mSettings .getCellMargin ()
@@ -1577,7 +1614,7 @@ private ViewHolder getViewHolderByPosition(int x, int y) {
1577
1614
} else if (mSettings .isHeaderFixed ()) {
1578
1615
if (tempY < mManager .getHeaderColumnHeight ()) {
1579
1616
// coordinate x, y in the column header's area
1580
- int column = mManager .getColumnByXWithShift (absX , mSettings .getCellMargin ());
1617
+ int column = mManager .getColumnByXWithShift (absX - getEmptySpace () , mSettings .getCellMargin ());
1581
1618
viewHolder = mHeaderColumnViewHolders .get (column );
1582
1619
} else if (tempX < mManager .getHeaderRowWidth () && !isRTL ()
1583
1620
|| tempX > calculateRowHeadersLeft () && isRTL ()) {
@@ -1586,14 +1623,14 @@ private ViewHolder getViewHolderByPosition(int x, int y) {
1586
1623
viewHolder = mHeaderRowViewHolders .get (row );
1587
1624
} else {
1588
1625
// coordinate x, y in the items area
1589
- int column = mManager .getColumnByXWithShift (absX , mSettings .getCellMargin ());
1626
+ int column = mManager .getColumnByXWithShift (absX - getEmptySpace () , mSettings .getCellMargin ());
1590
1627
int row = mManager .getRowByYWithShift (absY , mSettings .getCellMargin ());
1591
1628
viewHolder = mViewHolders .get (row , column );
1592
1629
}
1593
1630
} else {
1594
1631
if (absY < mManager .getHeaderColumnHeight ()) {
1595
1632
// coordinate x, y in the column header's area
1596
- int column = mManager .getColumnByXWithShift (absX , mSettings .getCellMargin ());
1633
+ int column = mManager .getColumnByXWithShift (absX - getEmptySpace () , mSettings .getCellMargin ());
1597
1634
viewHolder = mHeaderColumnViewHolders .get (column );
1598
1635
} else if (absX < mManager .getHeaderRowWidth () && !isRTL ()
1599
1636
|| absX > calculateRowHeadersLeft () && isRTL ()) {
@@ -1602,7 +1639,7 @@ private ViewHolder getViewHolderByPosition(int x, int y) {
1602
1639
viewHolder = mHeaderRowViewHolders .get (row );
1603
1640
} else {
1604
1641
// coordinate x, y in the items area
1605
- int column = mManager .getColumnByXWithShift (absX , mSettings .getCellMargin ());
1642
+ int column = mManager .getColumnByXWithShift (absX - getEmptySpace () , mSettings .getCellMargin ());
1606
1643
int row = mManager .getRowByYWithShift (absY , mSettings .getCellMargin ());
1607
1644
viewHolder = mViewHolders .get (row , column );
1608
1645
}
@@ -1748,6 +1785,7 @@ public TableInstanceSaver[] newArray(int size) {
1748
1785
};
1749
1786
private int mScrollX ;
1750
1787
private int mScrollY ;
1788
+ private int mLayoutDirection ;
1751
1789
1752
1790
public TableInstanceSaver () {
1753
1791
// no default data
@@ -1756,6 +1794,7 @@ public TableInstanceSaver() {
1756
1794
protected TableInstanceSaver (Parcel in ) {
1757
1795
this .mScrollX = in .readInt ();
1758
1796
this .mScrollY = in .readInt ();
1797
+ this .mLayoutDirection = in .readInt ();
1759
1798
}
1760
1799
1761
1800
@ Override
@@ -1767,6 +1806,7 @@ public int describeContents() {
1767
1806
public void writeToParcel (Parcel dest , int flags ) {
1768
1807
dest .writeInt (this .mScrollX );
1769
1808
dest .writeInt (this .mScrollY );
1809
+ dest .writeInt (this .mLayoutDirection );
1770
1810
}
1771
1811
}
1772
1812
0 commit comments