In this article, we took a look at how to create Radio Buttons Dynamically.
Here I have created this example to create the number of time slots (slot select by Radio Button) in between two selected time.
The final output looks like,
The final output looks like,
Here I have selected the Start time as 10:00 AM and End time as 12:00 PM and the Time interval between two slots as 15 mins. Therefore the calculation will result as 8 slots.
MainActivity Class
Example shows the Radio group in Grid view -
Adding the values to an ArrayList,
String slotscounts += " "+slotStartTime+ "-"+slotEndTime +",";
ArrayList<String> slots = new ArrayList<>();
slots.add(slotscounts);
ArrayList<String> slots = new ArrayList<>();
slots.add(slotscounts);
Passing the value to an Adapter class(Base Adapter used)
/*Call adapter to set_radiobuttons_for_timeSlots*/
GridSlotAdapter gridslotadapter = new GridSlotAdapter(MainActivity.this, slots);
GridSlotAdapter gridslotadapter = new GridSlotAdapter(MainActivity.this, slots);
/*set an adapter in Gridview*/
slotGrid.setAdapter(gridslotadapter);
Adapter Class
slotGrid.setAdapter(gridslotadapter);
Adapter Class
Adapter layout contains a RadioGroup
/* given string will be split by the argument delimiter provided. */
String[] temp = slots.split(delimiter);
String[] temp = slots.split(delimiter);
Create a radio button as final,
final RadioButton[] rb = new RadioButton[temp.length];
final RadioButton[] rb = new RadioButton[temp.length];
Set the dynamic radio button in the radio group
for (int i = 0; i < temp.length; i++) {
rb[i] = new RadioButton(mContext);
holder.radGrp.addView(rb[i]);
rb[i].setText(temp[i]);
}
rb[i] = new RadioButton(mContext);
holder.radGrp.addView(rb[i]);
rb[i].setText(temp[i]);
}
Complete Coding:
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
/**Declare Layout Elements**/
private Button btnStart, btnEnd, btnCreate;
private EditText edtInterval;
private GridView slotGrid;
private static TextView txtTiming, txtLabel;
private String strStart, strEnd;
int pHour, pMinute, strInterval, value = 0;
SimpleDateFormat simpleDateFormat;
Date inTime, outTime;
ArrayList<String> slots = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/** Initializing Layout Elements **/
btnStart = (Button) findViewById(R.id.idBtnStrTime);
btnEnd = (Button) findViewById(R.id.idBtnEndTime);
btnCreate = (Button) findViewById(R.id.idBtnCreate);
slotGrid = (GridView) findViewById(R.id.idSlotGrid);
edtInterval = (EditText) findViewById(R.id.idEdtInterval);
txtTiming = (TextView) findViewById(R.id.idSelectedTime);
txtLabel = (TextView) findViewById(R.id.idLabel);
/*recyclerView = (RecyclerView) findViewById(R.id.idRecycleView);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2);
recyclerView.setLayoutManager(layoutManager);*/
/*initialize_onClickListener*/
btnStart.setOnClickListener(this);
btnEnd.setOnClickListener(this);
btnCreate.setOnClickListener(this);
/*set_button_label*/
btnCreate.setText("Create Timeslot");
/*setting_visibility*/
txtLabel.setVisibility(View.INVISIBLE);
/*simpleDareFormat_used*/
simpleDateFormat = new SimpleDateFormat("hh:mm a");
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.idBtnStrTime:
getTime(btnStart);
break;
case R.id.idBtnEndTime:
getTime(btnEnd);
break;
case R.id.idBtnCreate:
if(btnCreate.getText().toString().contentEquals("Create New Timeslot")){
btnStart.setText("Select Start Time");
btnEnd.setText("Select End Time");
btnCreate.setText("Create Timeslot");
txtLabel.setVisibility(View.INVISIBLE);
slotGrid.setAdapter(null);
txtTiming.setText(null);
edtInterval.setText(null);
}else{
txtLabel.setVisibility(View.VISIBLE);
try {//validation to check all field contains required input
value = submit_validation();
} catch (ParseException e) {
e.printStackTrace();
}
if(value==1){
strStart = btnStart.getText().toString().trim();
strEnd = btnEnd.getText().toString().trim();
strInterval = Integer.parseInt(edtInterval.getText().toString().trim());
/*calling_method_to_calculate_numberOfSlots by time difference*/
calculateTimeDiff(strStart, strEnd, strInterval);
}
}
break;
default:
break;
}
}
/*method to calculate time difference and number of slots depends upon the given time interval*/
private void calculateTimeDiff(String strStart, String strEnd, int strInter) {
String slotscounts="";
slots.clear();
try {
Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
startCalendar.setTime(simpleDateFormat.parse(strStart));
endCalendar.setTime(simpleDateFormat.parse(strEnd));
while (endCalendar.after(startCalendar)) {
String slotStartTime = simpleDateFormat.format(startCalendar.getTime());
startCalendar.add(Calendar.MINUTE, strInter);
String slotEndTime = simpleDateFormat.format(startCalendar.getTime());
slotscounts += " "+slotStartTime+ "-"+slotEndTime +",";
/* slots.add(slotStartTime + " - " + slotEndTime);*/
Log.d("DATE", slotStartTime + " - " + slotEndTime +""+slots.size());
}
slots.add(slotscounts);
/*Call adapter to set_radiobuttons_for_timeSlots*/
GridSlotAdapter gridslotadapter = new GridSlotAdapter(MainActivity.this, slots);
slotGrid.setNumColumns(2);
slotGrid.setAdapter(gridslotadapter);
//recycle_view
/* gridAdapter = new GridAdapter(MainActivity.this, recyclerView, slots);
recyclerView.setAdapter(gridAdapter);*/
btnCreate.setText("Create New Timeslot");
}catch (ParseException e){
}
}
/*validation_method*/
private int submit_validation() throws ParseException {
int i=0;
strStart = btnStart.getText().toString().trim();
strEnd = btnEnd.getText().toString().trim();
String strIntTime = edtInterval.getText().toString().trim();
if(!validateDateFormat(strStart)){
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
"Select Start Time", Snackbar.LENGTH_LONG);
snackbar.show();
}else if(!validateDateFormat(strEnd)){
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
"Select End Time", Snackbar.LENGTH_LONG);
snackbar.show();
}else if(isTimeAfter(strStart, strEnd)){
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
"End time should less than Start time", Snackbar.LENGTH_LONG);
snackbar.show();
}else if(!(strIntTime!=null && strIntTime.length()>0)){
edtInterval.setError("Enter time interval for each timeslot");
} else{
edtInterval.setError(null);
i=1;
}
return i;
}
/*validation_to whether the dates has selected*/
private boolean validateDateFormat(String strTime) {
boolean valid = true;
try {
inTime = simpleDateFormat.parse(strTime);
} catch (Exception e) {
valid = false;
}
return valid;
}
/*validation_to check_FROM date should not greater than TO date*/
private boolean isTimeAfter(String strStart, String strEnd) throws ParseException {
inTime = simpleDateFormat.parse(strStart);
outTime = simpleDateFormat.parse(strEnd);
if (outTime.after(inTime)) { //Same way you can check with after() method also.
return false;
} else {
return true;
}
}
/*TimePicker_function*/
private void getTime(final Button btnStart) {
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
btnStart.setText(updateTime(hourOfDay,minute));
// btnStart.setText(hourOfDay + ":" + minute);//24hrs
}
}, pHour, pMinute, false);
timePickerDialog.show();
}
/*function to convert the 24hrs to 12hrs format*/
private String updateTime(int hours, int mins) {
String timeSet = "";
if (hours > 12) {
hours -= 12;
timeSet = "PM";
} else if (hours == 0) {
hours += 12;
timeSet = "AM";
} else if (hours == 12)
timeSet = "PM";
else
timeSet = "AM";
String minutes = "";
if (mins < 10)
minutes = "0" + mins;
else
minutes = String.valueOf(mins);
// Append in a StringBuilder
String aTime = new StringBuilder().append(hours).append(':')
.append(minutes).append(" ").append(timeSet).toString();
return aTime;
}
/*static_method_which call from adapter to set selected radiobutton time in textview*/
public static void settime(String itemTime){
txtTiming.setText(itemTime);
}
}
GridSlotAdapter.java
class GridSlotAdapter extends BaseAdapter{
Context mContext;
ArrayList<String> slotCntlist;
View view;
ViewHolder holder;
String[] temp;
String delimiter = ",";
String itemTime;
public GridSlotAdapter(Context context, ArrayList<String> slots ) {
mContext = context;
slotCntlist = slots;
}
@Override
public int getCount() {
return slotCntlist.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
view=convertView;
LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = vi.inflate(R.layout.radiogroup,parent, false);
holder = new ViewHolder();
holder.radGrp = (RadioGroup) convertView.findViewById(R.id.radio_group1);
// holder.radGrp.setOrientation(LinearLayout.VERTICAL);
String slots = slotCntlist.get(position);
/* given string will be split by the argument delimiter provided. */
temp = slots.split(delimiter);
final RadioButton[] rb = new RadioButton[temp.length];
for (int i = 0; i < temp.length; i++) {
rb[i] = new RadioButton(mContext);
rb[i].setTextAppearance(mContext, android.R.style.TextAppearance_Small);//just_for_TextSize
holder.radGrp.addView(rb[i]);
rb[i].setText(temp[i]);
}
/*radioGroup_ClickListener*/
holder.radGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
for (int i = 0; i < group.getChildCount(); i++) {
if (group.getChildAt(i).getId() == checkedId) {
itemTime = temp[i];
break;
}
}
MainActivity.settime(itemTime);//call_static_method_in MainActivity
}
});
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private class ViewHolder {
RadioGroup radGrp;
}
}
Implement the onClick listener for radio group to get the value of selected radio button, the selected radio button value will be set in the textview as in an image,
You can check the xml file from the source code attached as zip
____________________________________________________________________________
Sourcecode for the DynamicRadioButton.zip
Happy Coding...
Comments
Post a Comment