3

I am trying to pass the value from spinner.setOnItemSelectedListener to a string that contains date string. I have two spinners month and year, here I am showing only for month spinner because if I get the solution for month spinner then it will be same for year as well.


month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (parent.getId() == R.id.month_spinner){
                    seltmont = parent.getSelectedItem().toString();

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    setMonthView();
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

I have tried to access the spinner value like this:- String month = month_spinner.getSelectedItem().toString();

and try to pass the spinner onItemSelectListener value to combinedString string variable like this:-


 combinedString = "01/" + month + "/" + year ;
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
 selectdate = LocalDate.parse(combinedString, formatter);

I get the default value in the combined string that is already preselected in the spinner but when user try to change the default value that is shown in spinner it does not change the value. It gives null value in the combinedString. Can anyone help me How to pass the value from onItemSelectListener to combinedString

Is it because of the scope of a method (' { } ') or is it because of private or public variable declaration.

Please help.

By the way whole code is in JAVA. Here is complete code:-



public class MainActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener { 

    TextView monthYearText, textviewMonth,textviewYear,textviewYearnMonth;
    RecyclerView calendarReyclerView;
    LocalDate selectdate;

   private Spinner month_spinner,spinYear;
    String [] months;

    String combinedString;
    String selectedMonth;

    String seltmont;
    String selctYear;


    @SuppressLint("SetTextI18n")
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textviewMonth = findViewById(R.id.textviewMonth);
        textviewYear = findViewById(R.id.textviewYear);

        //for testing
        textviewYearnMonth = findViewById(R.id.textviewYearnMonth);

        month_spinner = findViewById(R.id.month_spinner);
        spinYear = findViewById(R.id.yearspin);


        populateSpinnerMonth();
        populateSpinnerYear();



        initWidget();
        selectdate = LocalDate.now();
        setMonthView();

       
        //---- on click listener ---//

        month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (parent.getId() == R.id.month_spinner){
                    seltmont = parent.getSelectedItem().toString();

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    setMonthView();
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        spinYear.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

             if (parent.getId() == R.id.yearspin){
                 selctYear = parent.getSelectedItem().toString();
                 Toast.makeText(MainActivity.this, "Selected Year" + selctYear, Toast.LENGTH_SHORT).show();
                 textviewYear.setText(selctYear);
                 setMonthView();
             }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });


        // ---- on click listener ---//


        String month = month_spinner.getSelectedItem().toString();
        String year= spinYear.getSelectedItem().toString();



       // String month = textviewMonth.getText().toString();
        //String year = textviewYear.getText().toString();


        //combinedString = "16/09/2019";
        combinedString = "01/" + month + "/" + year ;

       // combinedString = "01/" + mon + "/" + year ;


        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
        selectdate = LocalDate.parse(combinedString, formatter);

     /*   //not working
        String mon = textviewMonth.getText().toString();
        Log.d("month","code is going here");
        textviewYearnMonth.setText(mon);
        Log.d("month","code cross the textviewYearnMonth"); */
      //  textviewYearnMonth.setText(seltmont);


    }



    private void populateSpinnerYear() {

        ArrayList<String> years = new ArrayList<String>();
        int thisYear = Calendar.getInstance().get(Calendar.YEAR);

        for (int i = 1950; i <= thisYear; i++){
            years.add(Integer.toString(i));
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,years);
        spinYear.setAdapter(adapter);

    }

    private void populateSpinnerMonth() {

        months = new DateFormatSymbols().getMonths();
        ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,months);
        monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        month_spinner.setAdapter(monthAdapter);
        

    }


    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setMonthView() {


        monthYearText.setText(monthYearFromDate(selectdate));
        ArrayList<String> daysInMonth = daysInMonthArray(selectdate);

        CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),7); //for calendar columns
        calendarReyclerView.setLayoutManager(layoutManager);
        calendarReyclerView.setAdapter(calendarAdapter);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private ArrayList<String> daysInMonthArray(LocalDate date) {

        ArrayList<String> daysInMonthArray = new ArrayList<>();
        YearMonth yearMonth = YearMonth.from(date);

        int daysInMonth = yearMonth.lengthOfMonth();

        LocalDate firstOfMonth = selectdate.withDayOfMonth(1);
        int dayOfWeek = firstOfMonth.getDayOfWeek().getValue();

        for(int i = 1; i <= 42; i++)
        {
            if(i <= dayOfWeek || i > daysInMonth + dayOfWeek)
            {
                daysInMonthArray.add("");
            }
            else
            {
                daysInMonthArray.add(String.valueOf(i - dayOfWeek));
            }
        }
        return  daysInMonthArray;

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private String monthYearFromDate(LocalDate date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");
        return date.format(formatter);
    }

    private void initWidget() {

        calendarReyclerView = findViewById(R.id.calendarRecyclerView);
        monthYearText = findViewById(R.id.monthYearTV);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void previousMonthAction(View view) {



        selectdate = selectdate.minusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void nextMonthAction(View view) {

        selectdate = selectdate.plusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onItemClick(int position, String dayText) {

        if(!dayText.equals(""))
        {
            String message = "Selected Date " + dayText + " " + monthYearFromDate(selectdate);
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
           


    }

}


I have attached two images of the output:

Initial Stage at first launch ->Image 1

Initial Stage at first launch

After I changed the spinners value ->Image 2

After I changed the spinners value

Andrew
  • 123
  • 6

2 Answers2

3

Declare selectdate as static public static LocalDate selectdate;

Create a method named getSelectDate and call it to get changed value , such as inside onCreate, inside onItemSelected of month_spinner and spinYear.

 private void getSelectDate() {
    //added
    String month = month_spinner.getSelectedItem().toString();
    String year = spinYear.getSelectedItem().toString();


    //String month = textviewMonth.getText().toString();
    //String year = textviewYear.getText().toString();


    //combinedString = "16/09/2019";
    combinedString = "01/" + month + "/" + year;
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
    selectdate = LocalDate.parse(combinedString, formatter);
    //
}

This will fix your button issue also. All is well . setMonthView roll backed to your old code . Here yours Class-

    public class MainActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener {

    TextView monthYearText, textviewMonth, textviewYear, textviewYearnMonth;
    RecyclerView calendarReyclerView;
    public static LocalDate selectdate;

    private Spinner month_spinner, spinYear;
    String[] months;

    String combinedString;
    String selectedMonth;

    String seltmont;
    String selctYear;


    @SuppressLint("SetTextI18n")
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textviewMonth = findViewById(R.id.textviewMonth);
        textviewYear = findViewById(R.id.textviewYear);

        //for testing
        textviewYearnMonth = findViewById(R.id.textviewYearnMonth);

        month_spinner = findViewById(R.id.month_spinner);
        spinYear = findViewById(R.id.yearspin);


        populateSpinnerMonth();
        populateSpinnerYear();


        initWidget();
        //   selectdate = LocalDate.now();
        getSelectDate();
        setMonthView();


        //---- on click listener ---//

        month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (parent.getId() == R.id.month_spinner) {
                    seltmont = parent.getSelectedItem().toString();

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    //added
                    getSelectDate();
                    updateView();
                    setMonthView();


                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        spinYear.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (parent.getId() == R.id.yearspin) {
                    selctYear = parent.getSelectedItem().toString();
                    Toast.makeText(MainActivity.this, "Selected Year" + selctYear, Toast.LENGTH_SHORT).show();
                    textviewYear.setText(selctYear);
                    getSelectDate();
                    updateView();
                    setMonthView();
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });


        // ---- on click listener ---//

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private void getSelectDate() {
        //added
        String month = month_spinner.getSelectedItem().toString();
        String year = spinYear.getSelectedItem().toString();


        //String month = textviewMonth.getText().toString();
        //String year = textviewYear.getText().toString();


        //combinedString = "16/09/2019";
        combinedString = "01/" + month + "/" + year;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
        selectdate = LocalDate.parse(combinedString, formatter);
        //
    }

    //added
    private void updateView() {

        // combinedString = "01/" + mon + "/" + year ;

        //not working
        String mon = textviewMonth.getText().toString();
        //  Log.d("month","code is going here");
        //  textviewYearnMonth.setText(mon);
        // Log.d("month","code cross the textviewYearnMonth");
        textviewYearnMonth.setText(mon);
    }


    private void populateSpinnerYear() {

        ArrayList<String> years = new ArrayList<String>();
        int thisYear = Calendar.getInstance().get(Calendar.YEAR);

        for (int i = 1950; i <= thisYear; i++) {
            years.add(Integer.toString(i));
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, years);
        spinYear.setAdapter(adapter);

    }

    private void populateSpinnerMonth() {

        months = new DateFormatSymbols().getMonths();
        ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, months);
        monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        month_spinner.setAdapter(monthAdapter);


    }


    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setMonthView() {
        monthYearText.setText(monthYearFromDate(selectdate));
        ArrayList<String> daysInMonth = daysInMonthArray(selectdate);
        CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 7); //for calendar columns
        calendarReyclerView.setLayoutManager(layoutManager);
        calendarReyclerView.setAdapter(calendarAdapter);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private ArrayList<String> daysInMonthArray(LocalDate date) {

        ArrayList<String> daysInMonthArray = new ArrayList<>();
        YearMonth yearMonth = YearMonth.from(date);

        int daysInMonth = yearMonth.lengthOfMonth();

        LocalDate firstOfMonth = selectdate.withDayOfMonth(1);
        int dayOfWeek = firstOfMonth.getDayOfWeek().getValue();

        for (int i = 1; i <= 42; i++) {
            if (i <= dayOfWeek || i > daysInMonth + dayOfWeek) {
                daysInMonthArray.add("");
            } else {
                daysInMonthArray.add(String.valueOf(i - dayOfWeek));
            }
        }
        return daysInMonthArray;

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private String monthYearFromDate(LocalDate date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");
        return date.format(formatter);
    }

    private void initWidget() {

        calendarReyclerView = findViewById(R.id.calendarRecyclerView);
        monthYearText = findViewById(R.id.monthYearTV);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void previousMonthAction(View view) {


        selectdate = selectdate.minusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void nextMonthAction(View view) {

        selectdate = selectdate.plusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void onItemClick(int position, String dayText) {

        if (!dayText.equals("")) {
            String message = "Selected Date " + dayText + " " + monthYearFromDate(selectdate);
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();


        }

    }
}

To get "dd/MM/yyyy" this format use DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH).format(selectdate); , no other changes need .

To test -

@RequiresApi(api = Build.VERSION_CODES.O)
private void updateView() {

    // combinedString = "01/" + mon + "/" + year ;

    //not working
    String mon = textviewMonth.getText().toString();
    //  Log.d("month","code is going here");
    //  textviewYearnMonth.setText(mon);
    // Log.d("month","code cross the textviewYearnMonth");
    textviewYearnMonth.setText(DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH).format(selectdate));
}


 
Zahid Islam
  • 705
  • 1
  • 5
  • 11
  • Sorry I didn't mentioned that, but Yes I have already initialize selectdate to LocalDate. But this is not working. I want to know that how can I get the value from `spinner.setOnItemSelectedListener()` that I have initialize the `String selectMonth = parent.getSelectedItem().toString();` to `combinedString`. I have tried to store the value of `selectMonth` in `combinedString` but this gives null value. The problem is in scope of method and I don't know how to get or access the value from inner scope to outer scope of any method. – Andrew Jul 23 '21 at 19:31
  • "d/MM/yyyy" did you notice this pattern I have changed? month_spinner.getSelectedItem().toString(); this can inside inner or outer. – Zahid Islam Jul 23 '21 at 19:36
  • Declare your all variables as global , adreess month_spinner inside onCreate() – Zahid Islam Jul 23 '21 at 19:39
  • Thank you for your solution. I have already tried to initialize those variables as global, and also I have declare the month array and year array by programmatically. But that's not the issue. The issue is I don't know how to get the value from onSelectListener to outside of the method. So that I can easily put assign the selected value in combinedString. Wait let me update the question then I think it will help.. – Andrew Jul 24 '21 at 04:34
  • Thank you it is working!! you save me! but I found that the buttons are not working. i.e., `public void nextMonthAction(View view)` and `public void previousMonthAction(View view)` – Andrew Jul 24 '21 at 09:58
  • 1
    please check now , button issue should be fixed. – Zahid Islam Jul 24 '21 at 12:42
  • @ZahidIslam To convert a month to integer how can we achieve this in your given above code solution? for example:- July -> 07. It will be more helpful if you update the above answer for this requirement. – Mediad Jul 27 '21 at 19:05
  • @ZahidIslam Yes Even I want to know that. – Andrew Jul 27 '21 at 19:06
  • 1
    yearMonth.getMonthValue(); – Zahid Islam Jul 27 '21 at 19:26
  • @ZahidIslam When I get the value as July then will this function convert to integer? example: I get the text as:- 28/july/2021 that should convert to 28/7/2021 and one more thing I would like to add, Where to add this getMonthValue(); on my code – Andrew Jul 28 '21 at 04:27
  • @ZahidIslam thank you for everything! It is working great, except the day. Because I use ` public void onItemClick(int position, String dayText)` where day will be selected on item click and month and year is selected from the spinner. One more question How to change the date format . Now the format is 1950/08/22 – Andrew Jul 28 '21 at 08:18
  • 1
    please check update to format "dd/MM/yyyy" , ignore getMonthValue() , its unnecessary in this case. – Zahid Islam Jul 29 '21 at 17:52
  • @ZahidIslam thanks a lot for the solution but date is not changing on click listener m. by default it is 1. – Andrew Jul 31 '21 at 10:00
  • 1
    @Andrew Try to put `dayText+"/MM/yyyy"` in `onItemClick` function. so whole code will be: `textviewYearnMonth.setText(DateTimeFormatter.ofPattern(dayText+"/MM/yyyy",Locale.ENGLISH).format(selectdate));` – Mediad Jul 31 '21 at 11:08
  • thanks a lot guys!! It is working You both are a great teacher for all beginners like me. – Andrew Jul 31 '21 at 11:18
  • @ZahidIslam One question If I want to show the current date, how to show that one. For example; current date is 02 so how to highlight the 02 in the calendar with some color. Like here It is showing current month and year but not day – Andrew Aug 02 '21 at 10:10
  • @ZahidIslam Even I wanted to know that How to show or highlight the current date in this recycler calendar view – codingchef Aug 03 '21 at 04:44
  • We should check you final code , you can join with chat – Zahid Islam Aug 03 '21 at 08:48
  • @ZahidIslam can You help me with this question please:- https://stackoverflow.com/questions/68715605/how-to-put-events-in-calendar-using-recycler-view-in-android – Andrew Aug 10 '21 at 08:29
0

In the onItemSelected callbacks, just use the data sources with the position variable and you'll get it. For example for months spinner:

 month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (parent.getId() == R.id.month_spinner){
                    seltmont = months[position]; // ATTENTION HERE

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    setMonthView();
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

Do the same for all the spinner listeners.

Kozmotronik
  • 1,004
  • 1
  • 7
  • 17