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
After I changed the spinners value ->Image 2
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));
}