From 062ac4e67d509a5c22c9576245b6e6f3c828b398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AA=86=E5=A4=A7=E5=B3=B0?= Date: Wed, 5 Jul 2017 14:10:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9dayview=E7=9A=84=E7=BB=98?= =?UTF-8?q?=E5=88=B6=E6=9C=BA=E5=88=B6=20=E5=B7=B2=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behavior/RecyclerViewBehavior.java | 9 +- .../calendar/component/CalendarRenderer.java | 77 ++++++++++++---- .../component/CalendarViewAdapter.java | 47 ++-------- .../com/ldf/calendar/interf/IDayRenderer.java | 13 +-- .../java/com/ldf/calendar/view/Calendar.java | 5 +- .../main/java/com/ldf/calendar/view/Day.java | 90 +++++++++++++++++++ .../java/com/ldf/calendar/view/DayView.java | 46 +++------- .../main/java/com/ldf/calendar/view/Week.java | 20 +++-- .../ldf/supercalendar/CustomDayView.java | 11 ++- .../ldf/supercalendar/SyllabusActivity.java | 3 +- .../ldf/supercalendar/ThemeDayView.java | 6 +- 11 files changed, 202 insertions(+), 125 deletions(-) create mode 100644 calendar/src/main/java/com/ldf/calendar/view/Day.java diff --git a/calendar/src/main/java/com/ldf/calendar/behavior/RecyclerViewBehavior.java b/calendar/src/main/java/com/ldf/calendar/behavior/RecyclerViewBehavior.java index b9ec605..3c52b8c 100755 --- a/calendar/src/main/java/com/ldf/calendar/behavior/RecyclerViewBehavior.java +++ b/calendar/src/main/java/com/ldf/calendar/behavior/RecyclerViewBehavior.java @@ -3,6 +3,7 @@ import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.support.v4.view.ViewCompat; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.Log; @@ -38,13 +39,15 @@ public boolean onLayoutChild(CoordinatorLayout parent, RecyclerView child, int l @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, RecyclerView child, View directTargetChild, View target, int nestedScrollAxes) { - boolean isVertical = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) child.getLayoutManager(); + if(linearLayoutManager.findFirstCompletelyVisibleItemPosition() > 0) { + return false; + } + boolean isVertical = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; int firstRowVerticalPosition = (child == null || child.getChildCount() == 0) ? 0 : child.getChildAt(0).getTop(); - boolean recycleviewTopStatus = firstRowVerticalPosition >= 0; - return isVertical && (recycleviewTopStatus || !Utils.isScrollToBottom()) && child == directTargetChild; } diff --git a/calendar/src/main/java/com/ldf/calendar/component/CalendarRenderer.java b/calendar/src/main/java/com/ldf/calendar/component/CalendarRenderer.java index 7799add..0765ea8 100644 --- a/calendar/src/main/java/com/ldf/calendar/component/CalendarRenderer.java +++ b/calendar/src/main/java/com/ldf/calendar/component/CalendarRenderer.java @@ -2,12 +2,15 @@ import android.content.Context; import android.graphics.Canvas; +import android.util.Log; import com.ldf.calendar.Const; import com.ldf.calendar.Utils; +import com.ldf.calendar.interf.IDayRenderer; import com.ldf.calendar.interf.OnSelectDateListener; import com.ldf.calendar.model.CalendarDate; import com.ldf.calendar.view.Calendar; +import com.ldf.calendar.view.Day; import com.ldf.calendar.view.Week; /** @@ -18,6 +21,7 @@ public class CalendarRenderer { private Week weeks[] = new Week[Const.TOTAL_ROW]; // 行数组,每个元素代表一行 private Calendar calendar; private CalendarAttr attr; + private IDayRenderer dayRenderer; private Context context; private OnSelectDateListener onSelectDateListener; // 单元格点击回调事件 private CalendarDate seedDate; //种子日期 @@ -32,8 +36,13 @@ public CalendarRenderer(Calendar calendar , CalendarAttr attr , Context context) public void draw(Canvas canvas) { for (int row = 0; row < Const.TOTAL_ROW; row++) { - if (weeks[row] != null) - weeks[row].drawRow(canvas); + if (weeks[row] != null) { + for (int col = 0; col < Const.TOTAL_COL; col ++) { + if (weeks[row].days[col] != null) { + dayRenderer.drawDay(canvas , weeks[row].days[col]); + } + } + } } } @@ -43,7 +52,7 @@ public void onClickDate(int col, int row) { if (weeks[row] != null) { if(attr.getCalendarType() == CalendarAttr.CalendayType.MONTH) { if(weeks[row].days[col].getState() == State.CURRENT_MONTH){ - weeks[row].days[col].refreshState(State.SELECT); + weeks[row].days[col].setState(State.SELECT); selectedDate = weeks[row].days[col].getDate(); CalendarViewAdapter.saveDate(selectedDate); onSelectDateListener.onSelectDate(selectedDate); @@ -60,7 +69,7 @@ public void onClickDate(int col, int row) { onSelectDateListener.onSelectDate(selectedDate); } } else { - weeks[row].days[col].refreshState(State.SELECT); + weeks[row].days[col].setState(State.SELECT); selectedDate = weeks[row].days[col].getDate(); CalendarViewAdapter.saveDate(selectedDate); onSelectDateListener.onSelectDate(selectedDate); @@ -79,10 +88,23 @@ public void updateWeek(int rowIndex) { int day = currentWeekLastDay.day; for (int i = Const.TOTAL_COL - 1; i >= 0 ; i --) { CalendarDate date = currentWeekLastDay.modifyDay(day); - if (date.equals(CalendarViewAdapter.loadDate())) { - weeks[rowIndex].days[i].refreshContent(date , State.SELECT); + if(weeks[rowIndex] == null) { + weeks[rowIndex] = new Week(rowIndex); + } + if(weeks[rowIndex].days[i] != null) { + if (date.equals(CalendarViewAdapter.loadDate())) { + weeks[rowIndex].days[i].setState(State.SELECT); + weeks[rowIndex].days[i].setDate(date); + } else { + weeks[rowIndex].days[i].setState(State.CURRENT_MONTH); + weeks[rowIndex].days[i].setDate(date); + } } else { - weeks[rowIndex].days[i].refreshContent(date , State.CURRENT_MONTH); + if (date.equals(CalendarViewAdapter.loadDate())) { + weeks[rowIndex].days[i] = new Day(State.SELECT , date , rowIndex , i); + } else { + weeks[rowIndex].days[i] = new Day(State.CURRENT_MONTH , date , rowIndex , i); + } } day -- ; } @@ -116,11 +138,22 @@ private int fillWeek(int lastMonthDays, int currentMonthDays, int firstDayWeek, private void fillCurrentMonthDate(int day, int row, int col) { CalendarDate date = seedDate.modifyDay(day); + if(weeks[row] == null) { + weeks[row] = new Week(row); + } if(weeks[row].days[col] != null) { if(date.equals(CalendarViewAdapter.loadDate())) { - weeks[row].days[col].refreshContent(seedDate.modifyDay(day) , State.SELECT); + weeks[row].days[col].setDate(date); + weeks[row].days[col].setState(State.SELECT); } else { - weeks[row].days[col].refreshContent(seedDate.modifyDay(day) , State.CURRENT_MONTH); + weeks[row].days[col].setDate(date); + weeks[row].days[col].setState(State.CURRENT_MONTH); + } + } else { + if(date.equals(CalendarViewAdapter.loadDate())) { + weeks[row].days[col] = new Day(State.SELECT , date , row , col); + } else { + weeks[row].days[col] = new Day(State.CURRENT_MONTH , date , row , col); } } if(date.equals(seedDate)){ @@ -133,8 +166,14 @@ private void instantiateNextMonth(int currentMonthDays, int firstDayWeek, int ro seedDate.year, seedDate.month + 1, position - firstDayWeek - currentMonthDays + 1); + if(weeks[row] == null) { + weeks[row] = new Week(row); + } if(weeks[row].days[col] != null) { - weeks[row].days[col].refreshContent(date, State.NEXT_MONTH); + weeks[row].days[col].setDate(date); + weeks[row].days[col].setState(State.NEXT_MONTH); + } else { + weeks[row].days[col] = new Day(State.NEXT_MONTH , date , row , col); } // TODO: 17/6/27 当下一个月的天数大于七时,说明该月有六周 // if(position - firstDayWeek - currentMonthDays + 1 >= 7) { //当下一个月的天数大于七时,说明该月有六周 @@ -146,8 +185,14 @@ private void instantiateLastMonth(int lastMonthDays, int firstDayWeek, int row, seedDate.year, seedDate.month - 1, lastMonthDays - (firstDayWeek- position - 1)); + if(weeks[row] == null) { + weeks[row] = new Week(row); + } if(weeks[row].days[col] != null) { - weeks[row].days[col].refreshContent(date , State.NEXT_MONTH); + weeks[row].days[col].setDate(date); + weeks[row].days[col].setState(State.PAST_MONTH); + } else { + weeks[row].days[col] = new Day(State.PAST_MONTH , date , row , col); } } @@ -174,7 +219,7 @@ public void cancelSelectState(){ if (weeks[i] != null){ for (int j = 0; j < Const.TOTAL_COL; j++){ if(weeks[i].days[j].getState() == State.SELECT){ - weeks[i].days[j].refreshState(State.CURRENT_MONTH); + weeks[i].days[j].setState(State.CURRENT_MONTH); resetSelectedRowIndex(); break; } @@ -223,11 +268,7 @@ public void setOnSelectDateListener(OnSelectDateListener onSelectDateListener) { this.onSelectDateListener = onSelectDateListener; } - public void setWeeks(Week[] weeks) { - this.weeks = weeks; - } - - public Week[] getWeeks() { - return weeks; + public void setDayRenderer(IDayRenderer dayRenderer) { + this.dayRenderer = dayRenderer; } } diff --git a/calendar/src/main/java/com/ldf/calendar/component/CalendarViewAdapter.java b/calendar/src/main/java/com/ldf/calendar/component/CalendarViewAdapter.java index 68ac90e..e0ecbb2 100755 --- a/calendar/src/main/java/com/ldf/calendar/component/CalendarViewAdapter.java +++ b/calendar/src/main/java/com/ldf/calendar/component/CalendarViewAdapter.java @@ -5,7 +5,6 @@ import android.view.View; import android.view.ViewGroup; -import com.ldf.calendar.Const; import com.ldf.calendar.interf.OnAdapterSelectListener; import com.ldf.calendar.interf.IDayRenderer; import com.ldf.calendar.interf.OnSelectDateListener; @@ -13,7 +12,6 @@ import com.ldf.calendar.view.MonthPager; import com.ldf.calendar.model.CalendarDate; import com.ldf.calendar.view.Calendar; -import com.ldf.calendar.view.Week; import java.util.ArrayList; import java.util.HashMap; @@ -35,7 +33,7 @@ public CalendarViewAdapter(Context context , super(); this.calendarType = calendarType; init(context, onSelectDateListener); - setCustomDayView(dayView); + setCustomDayRenderer(dayView); } private void init(Context context, OnSelectDateListener onSelectDateListener) { @@ -87,8 +85,6 @@ public Object instantiateItem(ViewGroup container, int position) { }//每周的种子日期为这一周的最后一天 calendar.updateWeek(rowCount); } - calendar.getCellHeight(); - container.addView(calendar, 0); return calendar; } @@ -251,45 +247,14 @@ public CalendarAttr.CalendayType getCalendarType() { return calendarType; } - public void setCustomDayView(IDayRenderer dayRenderer) { - Week weeks0[] = new Week[Const.TOTAL_ROW]; - for (int j = 0 ; j < 6 ; j ++) { - Week week = new Week(j); - IDayRenderer[] days = new IDayRenderer[Const.TOTAL_COL]; - for (int i = 0 ; i < 7 ; i ++) { - days[i] = dayRenderer.copy(); - } - week.setDays(days); - weeks0[j] = week; - } + public void setCustomDayRenderer(IDayRenderer dayRenderer) { Calendar c0 = calendars.get(0); - c0.setWeeks(weeks0); - - Week weeks1[] = new Week[Const.TOTAL_ROW]; - for (int j = 0 ; j < 6 ; j ++) { - Week week = new Week(j); - IDayRenderer[] days = new IDayRenderer[Const.TOTAL_COL]; - for (int i = 0 ; i < 7 ; i ++) { - days[i] = dayRenderer.copy(); - } - week.setDays(days); - weeks1[j] = week; - } + c0.setDayRenderer(dayRenderer); + Calendar c1 = calendars.get(1); - c1.setWeeks(weeks1); - - Week weeks2[] = new Week[Const.TOTAL_ROW]; - for (int j = 0 ; j < 6 ; j ++) { - Week week = new Week(j); - IDayRenderer[] days = new IDayRenderer[Const.TOTAL_COL]; - for (int i = 0 ; i < 7 ; i ++) { - days[i] = dayRenderer.copy(); - } - week.setDays(days); - weeks2[j] = week; - } + c1.setDayRenderer(dayRenderer.copy()); Calendar c2 = calendars.get(2); - c2.setWeeks(weeks2); + c2.setDayRenderer(dayRenderer.copy()); } } \ No newline at end of file diff --git a/calendar/src/main/java/com/ldf/calendar/interf/IDayRenderer.java b/calendar/src/main/java/com/ldf/calendar/interf/IDayRenderer.java index 45d344b..c5761c9 100644 --- a/calendar/src/main/java/com/ldf/calendar/interf/IDayRenderer.java +++ b/calendar/src/main/java/com/ldf/calendar/interf/IDayRenderer.java @@ -4,6 +4,7 @@ import com.ldf.calendar.component.State; import com.ldf.calendar.model.CalendarDate; +import com.ldf.calendar.view.Day; import com.ldf.calendar.view.DayView; /** @@ -12,18 +13,10 @@ public interface IDayRenderer { - void refreshDate(CalendarDate date); + void refreshContent(); - void refreshState(State state); - - void refreshContent(CalendarDate date , State state); - - State getState(); - - CalendarDate getDate(); + void drawDay(Canvas canvas, Day day); IDayRenderer copy(); - void drawDay(Canvas canvas, float posX, float posY); - } diff --git a/calendar/src/main/java/com/ldf/calendar/view/Calendar.java b/calendar/src/main/java/com/ldf/calendar/view/Calendar.java index 75565bd..f14844a 100755 --- a/calendar/src/main/java/com/ldf/calendar/view/Calendar.java +++ b/calendar/src/main/java/com/ldf/calendar/view/Calendar.java @@ -6,6 +6,7 @@ import android.view.View; import com.ldf.calendar.Const; +import com.ldf.calendar.interf.IDayRenderer; import com.ldf.calendar.interf.OnAdapterSelectListener; import com.ldf.calendar.component.CalendarAttr; import com.ldf.calendar.component.CalendarRenderer; @@ -143,7 +144,7 @@ public CalendarDate getSeedDate() { return renderer.getSeedDate(); } - public void setWeeks(Week[] weeks){ - renderer.setWeeks(weeks); + public void setDayRenderer(IDayRenderer dayRenderer){ + renderer.setDayRenderer(dayRenderer); } } \ No newline at end of file diff --git a/calendar/src/main/java/com/ldf/calendar/view/Day.java b/calendar/src/main/java/com/ldf/calendar/view/Day.java new file mode 100644 index 0000000..e345d9c --- /dev/null +++ b/calendar/src/main/java/com/ldf/calendar/view/Day.java @@ -0,0 +1,90 @@ +package com.ldf.calendar.view; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.ldf.calendar.component.State; +import com.ldf.calendar.model.CalendarDate; + +/** + * Created by ldf on 17/7/5. + */ + +public class Day implements Parcelable { + private State state; + private CalendarDate date; + private int posRow; + private int posCol; + + public Day(State state , CalendarDate date , int posRow , int posCol) { + this.state = state; + this.date = date; + this.posRow = posRow; + this.posCol = posCol; + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + public CalendarDate getDate() { + return date; + } + + public void setDate(CalendarDate date) { + this.date = date; + } + + public int getPosRow() { + return posRow; + } + + public void setPosRow(int posRow) { + this.posRow = posRow; + } + + public int getPosCol() { + return posCol; + } + + public void setPosCol(int posCol) { + this.posCol = posCol; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(this.state == null ? -1 : this.state.ordinal()); + dest.writeSerializable(this.date); + dest.writeInt(this.posRow); + dest.writeInt(this.posCol); + } + + protected Day(Parcel in) { + int tmpState = in.readInt(); + this.state = tmpState == -1 ? null : State.values()[tmpState]; + this.date = (CalendarDate) in.readSerializable(); + this.posRow = in.readInt(); + this.posCol = in.readInt(); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public Day createFromParcel(Parcel source) { + return new Day(source); + } + + @Override + public Day[] newArray(int size) { + return new Day[size]; + } + }; +} diff --git a/calendar/src/main/java/com/ldf/calendar/view/DayView.java b/calendar/src/main/java/com/ldf/calendar/view/DayView.java index 724e753..3655bb4 100644 --- a/calendar/src/main/java/com/ldf/calendar/view/DayView.java +++ b/calendar/src/main/java/com/ldf/calendar/view/DayView.java @@ -2,6 +2,7 @@ import android.content.Context; import android.graphics.Canvas; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; @@ -10,17 +11,13 @@ import com.ldf.calendar.interf.IDayRenderer; import com.ldf.calendar.model.CalendarDate; -import java.lang.ref.WeakReference; -import java.util.HashMap; - /** * Created by ldf on 16/10/19. */ public abstract class DayView extends RelativeLayout implements IDayRenderer { - protected State state; - protected CalendarDate date; + protected Day day; protected Context context; protected int layoutResource; @@ -43,44 +40,27 @@ public DayView(Context context, int layoutResource) { * @param layoutResource */ private void setupLayoutResource(int layoutResource) { - LayoutInflater.from(getContext()).inflate(layoutResource, this); - } - - @Override - public void refreshDate(CalendarDate date) { - this.date = date; - refreshContent(date , state); - } - - @Override - public void refreshState(State state) { - this.state = state; - refreshContent(date , state); + View inflated = LayoutInflater.from(getContext()).inflate(layoutResource, this); + inflated.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + inflated.layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); } @Override - public void refreshContent(CalendarDate date, State state) { - this.state = state; - this.date = date; + public void refreshContent() { measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); } @Override - public State getState() { - return state; - } - - @Override - public CalendarDate getDate() { - return date; - } - - @Override - public void drawDay(Canvas canvas , float posX , float posY) { + public void drawDay(Canvas canvas , Day day) { + this.day = day; + refreshContent(); int saveId = canvas.save(); - canvas.translate(posX * getMeasuredWidth(), posY * getMeasuredHeight()); + canvas.translate(day.getPosCol() * getMeasuredWidth(), + day.getPosRow() * getMeasuredHeight()); + Log.e("ldf","posY = " + day.getPosCol()); draw(canvas); canvas.restoreToCount(saveId); } diff --git a/calendar/src/main/java/com/ldf/calendar/view/Week.java b/calendar/src/main/java/com/ldf/calendar/view/Week.java index 8b60003..e7f17d1 100644 --- a/calendar/src/main/java/com/ldf/calendar/view/Week.java +++ b/calendar/src/main/java/com/ldf/calendar/view/Week.java @@ -11,21 +11,25 @@ public class Week { public int row; + public Day[] days = new Day[Const.TOTAL_COL]; public Week(int row) { this.row = row; } - public IDayRenderer[] days = new IDayRenderer[Const.TOTAL_COL]; + public int getRow() { + return row; + } - public void setDays(IDayRenderer[] days) { - this.days = days; + public void setRow(int row) { + this.row = row; } - public void drawRow(Canvas canvas) { - for (int col = 0; col < days.length; col++) { - if (days[col] != null) - days[col].drawDay(canvas , col , row ); - } + public Day[] getDays() { + return days; + } + + public void setDays(Day[] days) { + this.days = days; } } diff --git a/example/src/main/java/com/hqyxjy/ldf/supercalendar/CustomDayView.java b/example/src/main/java/com/hqyxjy/ldf/supercalendar/CustomDayView.java index f6cd5de..b1e3e1b 100644 --- a/example/src/main/java/com/hqyxjy/ldf/supercalendar/CustomDayView.java +++ b/example/src/main/java/com/hqyxjy/ldf/supercalendar/CustomDayView.java @@ -39,11 +39,11 @@ public CustomDayView(Context context, int layoutResource) { } @Override - public void refreshContent(CalendarDate date, State state) { - renderToday(date); - renderSelect(state); - renderMarker(date, state); - super.refreshContent(date, state); + public void refreshContent() { + renderToday(day.getDate()); + renderSelect(day.getState()); + renderMarker(day.getDate(), day.getState()); + super.refreshContent(); } private void renderMarker(CalendarDate date, State state) { @@ -57,7 +57,6 @@ private void renderMarker(CalendarDate date, State state) { } else { marker.setEnabled(false); } - super.refreshContent(date, state); } } else { marker.setVisibility(GONE); diff --git a/example/src/main/java/com/hqyxjy/ldf/supercalendar/SyllabusActivity.java b/example/src/main/java/com/hqyxjy/ldf/supercalendar/SyllabusActivity.java index 912ada0..37afc63 100644 --- a/example/src/main/java/com/hqyxjy/ldf/supercalendar/SyllabusActivity.java +++ b/example/src/main/java/com/hqyxjy/ldf/supercalendar/SyllabusActivity.java @@ -8,7 +8,6 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.View; import android.widget.TextView; @@ -201,7 +200,7 @@ private void refreshMonthPager() { private void refreshSelectBackground(){ ThemeDayView themeDayView = new ThemeDayView(context , R.layout.custom_day_focus); - calendarAdapter.setCustomDayView(themeDayView); + calendarAdapter.setCustomDayRenderer(themeDayView); calendarAdapter.notifyDataSetChanged(); calendarAdapter.notifyDataChanged(new CalendarDate()); } diff --git a/example/src/main/java/com/hqyxjy/ldf/supercalendar/ThemeDayView.java b/example/src/main/java/com/hqyxjy/ldf/supercalendar/ThemeDayView.java index 97baba6..b0dbd9e 100644 --- a/example/src/main/java/com/hqyxjy/ldf/supercalendar/ThemeDayView.java +++ b/example/src/main/java/com/hqyxjy/ldf/supercalendar/ThemeDayView.java @@ -37,7 +37,9 @@ public ThemeDayView(Context context, int layoutResource) { } @Override - public void refreshContent(CalendarDate date, State state) { + public void refreshContent() { + CalendarDate date = day.getDate(); + State state = day.getState(); if(date != null) { if(date.equals(today)) { dateTv.setText("今"); @@ -52,7 +54,7 @@ public void refreshContent(CalendarDate date, State state) { } else { selectedBackground.setVisibility(GONE); } - super.refreshContent(date, state); + super.refreshContent(); } @Override