Detect listener on month scrolling in android times square
Asked Answered
N

1

16

I have implemented code for android times square, but I am unable to detect the event when the month change. I have to highlight multiple range of dates from months.

This is the way I have done but, I am unable to detect when month got changed while scrolling

code:

public class Calender extends Activity implements OnDateChangeListener,CalendarCellDecorator {

String BOOKING_URL="http://www.example.com/app/webroot/mobile/booking.php";
ArrayList<String>list=new ArrayList<String>();
CalendarPickerView calender;
ArrayList<Date> dates = new ArrayList<Date>();
Calendar lastYear,nextYear;
Calendar today;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calender);

    getActionBar().setTitle("CALENDER");
    getActionBar().setIcon(R.drawable.back);
    getActionBar().setDisplayOptions(getActionBar().getDisplayOptions()| ActionBar.DISPLAY_SHOW_CUSTOM);
    ImageView imageView = new ImageView(getActionBar().getThemedContext());
    imageView.setScaleType(ImageView.ScaleType.CENTER);
    imageView.setImageResource(R.drawable.manu_btn);
    ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT,ActionBar.LayoutParams.WRAP_CONTENT, Gravity.RIGHT| Gravity.CENTER_VERTICAL);
    layoutParams.rightMargin = 40;
    imageView.setLayoutParams(layoutParams);
    getActionBar().setCustomView(imageView);
    centerActionBarTitle();
    imageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    });

    nextYear = Calendar.getInstance();
    nextYear.add(Calendar.YEAR, 2);

    lastYear= Calendar.getInstance();
    lastYear.add(Calendar.YEAR, -2);

    today = Calendar.getInstance();

    calender = (CalendarPickerView) findViewById(R.id.calendar);
    calender.setOnScrollListener(new OnScrollListener() {

        private int mLastFirstVisibleItem;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {



            if(mLastFirstVisibleItem<firstVisibleItem)
            {
                Log.d("SCROLLING DOWN","TRUE");
            }
            if(mLastFirstVisibleItem>firstVisibleItem)
            {
                Log.d("SCROLLING UP","TRUE");

            }
            mLastFirstVisibleItem=firstVisibleItem;

        }   

    });


    calender1.init(lastYear.getTime(), nextYear.getTime());//.inMode(SelectionMode.RANGE);



    new MyAsyncTask(BOOKING_URL).execute();

}

.....


try {

            JSONArray array=new JSONArray(response);
            for (int i = 0; i < array.length(); i++) {

                JSONObject json=array.getJSONObject(i);
                list.add(json.getString("fromDate")+" "+json.getString("toDate"));

            }

            SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd");
            TimeZone gmt = TimeZone.getTimeZone("GMT");
            sdf.setTimeZone(gmt);
            sdf.setLenient(false);

            try {
                Date date = sdf.parse(list.get(0).split(" ")[0]);
                Date date1 = sdf.parse(list.get(0).split(" ")[1]);
                System.out.println(date);
                dates.add(date);
                dates.add(date1);
            } catch (Exception e) {
                e.printStackTrace();
            }                   

            calendar.init(lastYear.getTime(), nextYear.getTime()).inMode(SelectionMode.RANGE).withSelectedDates(dates);             

        } catch (JSONException e) {
            e.printStackTrace();

        }

....

@Override
public void decorate(CalendarCellView calendarCellView, Date date) {

    Log.d("TAG", "a"+date);

    if (date.getDate() < 5) {
        calendarCellView.setBackgroundResource(R.drawable.side_testi);
    } else {
        calendarCellView.setBackgroundResource(R.drawable.side_book);
    }
}

json response:

[
    {
        "fromDate": "2014-03-03",
        "toDate": "2014-03-07",
        "name": "Anurag",
        "email": "[email protected]",
        "phone": "2147483647",
        "address": "Y-51, 3rd Floor, Sector 12",
        "comment": "I wanna view here."
    },
    {
        "fromDate": "2014-04-09",
        "toDate": "2014-04-09",
        "name": "Dana Edgar",
        "email": "[email protected]",
        "phone": "0",
        "address": "BHM Construction Inc.\r\n522 Walnut Avenue\r\nVallejo, CA 94592",
        "comment": "Primary guest will be Jeffery Mazet and his contact phone number is (530)601-0570. His email is [email protected]."
    },
    {
        "fromDate": "2015-02-09",
        "toDate": "2015-02-25",
        "name": "Ghfb",
        "email": "[email protected]",
        "phone": "2147483647",
        "address": "\nGffbbnn",
        "comment": "Dhgbngh"
    },
    {
        "fromDate": "2015-02-09",
        "toDate": "2015-02-25",
        "name": "Ghfb",
        "email": "[email protected]",
        "phone": "2147483647",
        "address": "\nGffbbnn",
        "comment": "Dhgbngh"
    },
    {
        "fromDate": "2015-06-04",
        "toDate": "2015-09-04",
        "name": "rewr",
        "email": "[email protected]",
        "phone": "2147483647",
        "address": "cbvcb",
        "comment": "vnbvbbm"
    }
]

layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

     <com.squareup.timessquare.CalendarPickerView
      android:id="@+id/calendar"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:paddingLeft="16dp"
      android:paddingRight="16dp"
      android:paddingBottom="16dp"
      android:scrollbarStyle="outsideOverlay"
      android:clipToPadding="false"
      android:background="#FFFFFF"
      />


</LinearLayout>

enter image description here


issues raised

It seems I am missing something. Any suggestion is appreciated.

Non answered 21/4, 2015 at 6:28 Comment(1)
I have the same issue .Counterproductive
A
9

Using the CalendarCellDecorator you could write something like this:

public class MonthDecorator implements CalendarCellDecorator {

    @Override
    public void decorate(CalendarCellView calendarCellView, Date date) {
        if (date.getDate() < 5) {
            calendarCellView.setBackgroundResource(R.drawable.red_background);
        } else {
            calendarCellView.setBackgroundResource(R.drawable.blue_background);
        }
    }
}

It is a simple example - the first 5 days in every month will have a different background than the rest of the days. Every cell in every month passes through the decorator, so you could use it to change the UI of cells in multiple months. Generally you'll have to store the dates which should be highlighted CalendarCellDecorator and in the decorate method check whether the given cellView is showing one of these dates. In my case I just check whether the date is before 5th, but you could make a more meaningful check there - i.e. give a range of dates and check whether the given date is inside this range for example.

EDIT: showing how to apply the decorator:

calendar.init(lastYear.toDate(), nextYear.toDate()).inMode(CalendarPickerView.SelectionMode.RANGE);
List<CalendarCellDecorator> decoratorList = new ArrayList<>();
decoratorList.add(new MonthDecorator());
calendar.setDecorators(decoratorList);
Accrual answered 24/4, 2015 at 17:1 Comment(4)
@Samuil Yanovski decorate(CalendarCellView calendarCellView, Date date) is not being calling while building the Calendar nor while doing the scroll .....so not working for me :-(Counterproductive
You mean it is never called? Could you edit your question including the code related to the CalendarCellDecorator - i.e. the class and the call to the calendar's setDecorators methods? :)Accrual
@SamuilYanovski sorry to say but I have already applied the way you suggested. updated the latest code. regardsEnrichetta
@maveň are you calling calendar.setDecorators(decoratorList); - since I don't see it in your post. Could you make sure you've applied the decorator correctly. I'll edit my answer to show you how I call it, just in case there is some misunderstanding.Accrual

© 2022 - 2024 — McMap. All rights reserved.