Example 1
If the JSON data describes an array, and each element of that array is an object:
[
{
"id": 1,
"discipline": "BCS-2E",
"starttime": "08:30",
"endtime": "10:00",
"day": "Monday",
"courseCode": "ENG325",
"courseName": "CPS",
"venue": "Lt3",
"teacherName": "Naeem",
"sessionId": "5",
"sessionName": null
},
{
"id": 103,
"discipline": "BCS-2D",
"starttime": "10:00",
"endtime": "11:30",
"day": "Tuesday",
"courseCode": "CS400",
"courseName": "DBS",
"venue": "Lab6",
"teacherName": "Abdul Rehman",
"sessionId": "5",
"sessionName": null
},
{
"id": 214,
"discipline": "BAI-3A",
"starttime": "11:30",
"endtime": "01:00",
"day": "Wednesday",
"courseCode": "CS632",
"courseName": "AI",
"venue": "Lab6",
"teacherName": "Dr. Sadaf,Rifhat",
"sessionId": "5",
"sessionName": null
},
{
"id": 326,
"discipline": "BIT-8B",
"starttime": "01:30",
"endtime": "03:00",
"day": "Thursday",
"courseCode": "ENG315",
"courseName": "TBW",
"venue": "Lt12",
"teacherName": "Sumaira",
"sessionId": "5",
"sessionName": null
},
{
"id": 439,
"discipline": "BCS-2B",
"starttime": "03:00",
"endtime": "04:30",
"day": "Friday",
"courseCode": "MTH315",
"courseName": "MVC",
"venue": "Lt5",
"teacherName": "Shahid Rasheed",
"sessionId": "5",
"sessionName": null
}
]the JSON Data Set will create a row for each object in the array, and each property on the object will become a column.
code XML Show Recycler View:
| LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".fragments.Admin.Schedule.Reschedule.AdminScheduleReScheduleFreeSlotActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="Selected Venue " android:textSize="20dp" android:textStyle="bold" android:id="@+id/txt_view_selected_venue"/> <androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/Recycerview_admin_Reschedule"/> </LinearLayout> |
Background XML Design Code :
| <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Drop Shadow Stack --> <item> <shape> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
<solid android:color="#00CCCCCC" />
<corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
<solid android:color="#10CCCCCC" />
<corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
<solid android:color="#20CCCCCC" />
<corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
<solid android:color="#30CCCCCC" />
<corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
<solid android:color="#50CCCCCC" />
<corners android:radius="3dp" /> </shape> </item>
<!-- Background --> <item> <shape> <solid android:color="@android:color/white" />
<corners android:radius="3dp" /> </shape> </item>
</layer-list> |
code Recycler View Cell Design:
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_marginLeft="6dp" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/linearLayout_Day_of_Name"></LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_marginRight="3dp" android:layout_marginLeft="6dp" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="9dp" android:orientation="horizontal" android:id="@+id/linearLayout_Free_slot"></LinearLayout> </LinearLayout> </LinearLayout>
|
Recycler View Java Class Code :
| package com.example.meyepro.adapters; import android.content.Context; import android.graphics.Typeface; import android.os.Build; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView;
import com.example.meyepro.R; import com.example.meyepro.databinding.RecyclerviewRescheduleFreeSlotCellBinding; import com.example.meyepro.fragments.Admin.Schedule.Reschedule.AdminScheduleReScheduleFreeSlotActivity; import com.example.meyepro.models.TimeTable; import com.example.meyepro.models.recordings_details_by_teachername;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors;
public class AdminScheduleFreeSlotAdapter extends RecyclerView.Adapter<AdminScheduleFreeSlotAdapter.AdminScheduleFreeSlotViewHolder>{ private ArrayList<TimeTable> TimeTableList; private Context context; private Fragment fragment; ArrayList<String> uniqueStartTimes= new ArrayList<>(); ArrayList<String> uniqueEndTimes= new ArrayList<>(); ArrayList<String> uniqueDays= new ArrayList<>(); ArrayList<String> uniqueVenue= new ArrayList<>(); ArrayList<HashMap<String, ArrayList<String>>> venueMap = new ArrayList<>(); Spinner[][] allSpinners = new Spinner[uniqueDays.size()][uniqueDays.size()];
public AdminScheduleFreeSlotAdapter(ArrayList<TimeTable> TimeTableList, Context context) { this.TimeTableList = TimeTableList; this.context = context; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
uniqueStartTimes.addAll(TimeTableList.stream().distinct().map(t -> t.getStarttime()).distinct().collect(Collectors.toList())); uniqueEndTimes.addAll(TimeTableList.stream().distinct().map(t -> t.getEndtime()).distinct().collect(Collectors.toList())); uniqueDays.addAll(TimeTableList.stream().distinct().map(t -> t.getDay()).distinct().collect(Collectors.toList())); uniqueVenue.addAll(TimeTableList.stream().distinct().map(t -> t.getVenue()).distinct().collect(Collectors.toList())); allSpinners=null; allSpinners = new Spinner[uniqueDays.size()][uniqueDays.size()]; }
// for (String Day : uniqueDays) { // HashMap<String, ArrayList<String>> map = new HashMap<>(); // map.put(Day, new ArrayList<String>()); // venueMap.add(map); // } // //// // // for (TimeTable t : TimeTableList ){ // if (t.getStarttime() == ) { // String venueName = t.getVenue(); // for (HashMap<String, ArrayList<String>> map : venueMap) { // ArrayList<String> venues = map.get(t.getDay()); // if (venues != null && venues.contains(venueName)) { // venues.remove(venueName); // break; // } // } // } // }
// // for (String s:uniqueVenue) { // System.out.println("dddd"+s); // }
} public AdminScheduleFreeSlotAdapter (ArrayList<TimeTable> TimeTableList, Context context, Fragment fragment ) { this.TimeTableList = TimeTableList; this.context = context; this.fragment=fragment;
} @NonNull @Override public AdminScheduleFreeSlotViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { RecyclerviewRescheduleFreeSlotCellBinding b =RecyclerviewRescheduleFreeSlotCellBinding. inflate(LayoutInflater .from(parent.getContext()), parent, false);
AdminScheduleFreeSlotViewHolder vh = new AdminScheduleFreeSlotViewHolder(b); return vh; }
@Override public void onBindViewHolder(@NonNull AdminScheduleFreeSlotViewHolder holder, int position) { if(position==0){ holder.bindDays(position); } String obj = uniqueStartTimes.get(position); // holder.binding.txtViewStart.setText(obj); holder.bind(position); // holder.binding.textViewVenue1.setText(obj.getNAME()+""); // holder.binding.textViewVenue2.setText(obj.getNAME()+""); }
@Override public int getItemCount() { return uniqueStartTimes.size(); }
class AdminScheduleFreeSlotViewHolder extends RecyclerView.ViewHolder { RecyclerviewRescheduleFreeSlotCellBinding binding;//<----
public AdminScheduleFreeSlotViewHolder( @NonNull RecyclerviewRescheduleFreeSlotCellBinding itemView) { super(itemView.getRoot()); binding = itemView;//<---- }
public void bind(int RowPosition) { binding.linearLayoutFreeSlot.removeAllViews(); TextView textView = new TextView(context); // Set the text textView.setText(uniqueStartTimes.get(RowPosition)+"\n"+uniqueEndTimes.get(RowPosition)); // Set the width and height int width = ViewGroup.LayoutParams.WRAP_CONTENT;; // in pixels int height =150; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(width, height); textView.setLayoutParams(layoutParams); // Set the gravity and layout gravity textView.setGravity(Gravity.CENTER); binding.linearLayoutFreeSlot.addView(textView); //create Spinner Spinner[] spinners = new Spinner[uniqueDays.size()]; String[][] items = new String[uniqueDays.size()][];
for (int i = 0; i < spinners.length; i++) { TableRow.LayoutParams params = new TableRow.LayoutParams( 220, TableRow.LayoutParams.MATCH_PARENT, 1f); params.gravity = Gravity.RIGHT; // Create Spinners for each TableRow Spinner spinner = new Spinner(context); spinner.setLayoutParams(params); // unique venue List<String> timeTables1= new ArrayList<>(); final int finalvalue=i; timeTables1.add(""); timeTables1.addAll(uniqueVenue); for (TimeTable t :TimeTableList){ if (t.getStarttime().toString().equals(uniqueStartTimes.get(RowPosition)) ) { if (t.getDay().equals(uniqueDays.get(finalvalue))) { if(timeTables1.equals(t.getVenue())); timeTables1.remove(t.getVenue());
} } } // use linq i // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // timeTables1 = uniqueVenue.stream() // .filter(venue -> TimeTableList.stream() // .noneMatch(t -> t.getStarttime().equals(uniqueStartTimes.get(RowPosition)) // && t.getDay().equals(uniqueDays.get(finalvalue)) // && t.getVenue().equals(venue))) // .collect(Collectors.toList()); // }
items[i] = timeTables1.toArray(new String[0]);
// items[i] = new String[]{"", "Spinner " + i + " Item 1", "Spinner " + i + " Item 2", "Spinner " + i + " Item 3"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(itemView.getContext(), android.R.layout.simple_spinner_dropdown_item, items[i]); // adapter.setDropDownViewResource(R.layout.spinner_layout_timetable); spinner.setAdapter(adapter); final int finalI = i; // Drawable drawable = ContextCompat.getDrawable(itemView.getContext(), R.drawable.teacher_recyclerview_background_cell); // spinner.setBackground(drawable); // spinner.setBackgroundResource(R.drawable.teacher_recyclerview_background_cell); spinners[i] = spinner;
allSpinners[RowPosition][i] = spinner; // Store the spinner in the array Spinner emptySpinner = spinners[i]; emptySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { AdminScheduleReScheduleFreeSlotActivity reschedule= (AdminScheduleReScheduleFreeSlotActivity) context; reschedule.recyclerviewSelectVenueDrowpdown(emptySpinner.getSelectedItem().toString(),context ); if (position != 0) { // Disable all other spinners for (int row = 0; row < allSpinners.length; row++) { for (int col = 0; col < allSpinners[row].length; col++) { Spinner spinner = allSpinners[row][col]; if (spinner != null && spinner.getSelectedItem().toString().equals("")) { // Disable empty spinner spinner.setEnabled(false); } else if (row != RowPosition || col != finalI) { // Disable non-selected spinners spinner.setEnabled(false); } else { // Enable selected spinner spinner.setEnabled(true); } } }
Toast.makeText(context, "" + emptySpinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show(); } else { // Enable all spinners for (int row = 0; row < allSpinners.length; row++) { for (int col = 0; col < allSpinners[row].length; col++) { Spinner spinner = allSpinners[row][col]; if (spinner != null) { spinner.setEnabled(true); } } } } }
@Override public void onNothingSelected(AdapterView<?> parent) {
} }); binding.linearLayoutFreeSlot.addView(spinner);
} }
//create end
public void bindDays(int position) { binding.linearLayoutDayOfName.removeAllViews(); TextView textViewFirst = new TextView(itemView.getContext()); textViewFirst.setLayoutParams(new LinearLayout.LayoutParams( 120, 140,1f));
// Set the gravity and layout gravity textViewFirst .setGravity(Gravity.CENTER); binding.linearLayoutDayOfName.addView(textViewFirst); for (int i = 0; i < uniqueDays.size(); i++) { TextView textView = new TextView(itemView.getContext()); textView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, 100,1f)); textView.setBackgroundResource(R.drawable.teacher_recyclerview_background_cell); textView.setTypeface(null, Typeface.BOLD); textView .setGravity(Gravity.CENTER); textView.setText(uniqueDays.get(i)); binding.linearLayoutDayOfName.addView(textView); } }
} }
|
RecyclerView AdminScheduleReScheduleFreeSlotActivity Main java Code:
| package com.example.meyepro.fragments.Admin.Schedule.Reschedule; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Context; import android.os.Bundle; import android.widget.Toast;
import com.example.meyepro.R; import com.example.meyepro.adapters.AdminScheduleFreeSlotAdapter; import com.example.meyepro.api.Api; import com.example.meyepro.api.RetrofitClient; import com.example.meyepro.databinding.ActivityAdminScheduleReScheduleFreeSlotBinding; import com.example.meyepro.models.TimeTable;
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;
import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response;
public class AdminScheduleReScheduleFreeSlotActivity extends AppCompatActivity { ActivityAdminScheduleReScheduleFreeSlotBinding binding;
ArrayList<TimeTable> timeSlots=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding= ActivityAdminScheduleReScheduleFreeSlotBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());
RetrofitClient client= RetrofitClient.getInstance(); Api api= client.getMyApi(); api.All_timetable_teacher_details().enqueue(new Callback<ArrayList<TimeTable>>() { @Override public void onResponse(Call<ArrayList<TimeTable>> call, Response<ArrayList<TimeTable>> response) { if(response.isSuccessful()){ Toast.makeText(getApplicationContext(), "Successful"+response.body().get(0).getCourseCode(), Toast.LENGTH_SHORT).show(); timeSlots.clear(); timeSlots.addAll(response.body());
AdminScheduleFreeSlotAdapter adapter = new AdminScheduleFreeSlotAdapter(timeSlots, AdminScheduleReScheduleFreeSlotActivity.this); LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext()); binding.RecycerviewAdminReschedule.setLayoutManager(manager); // Binding.RecycerviewAdminViewTeacher.setHasFixedSize(true); binding.RecycerviewAdminReschedule. setAdapter(adapter); // binding.RecycerviewAdminReschedule.getAdapter().notifyDataSetChanged();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
List<String> uniqueStartTimes = timeSlots.stream().distinct() .map(t -> t.getStarttime()).distinct()
// .sorted((t1, t2) -> { // try { // SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); // sdf.setTimeZone(TimeZone.getTimeZone("Asia/Karachi")); // Date d1 = sdf.parse(t1); // Date d2 = sdf.parse(t2); // return d1.compareTo(d2); // } catch (ParseException e) { // return 0; // } // }) .collect(Collectors.toList());
// List<TimeTable> uniqueTimeTables = timeSlots.stream().distinct() // .filter(t -> uniqueStartTimes.contains(t.getStarttime())) // .collect(Collectors.toList()); // // List<TimeTable> TeacherTimeTables = timeSlots.stream() // .filter(t -> t.getTeacherName().contains("Naeem")) // .collect(Collectors.toList());
// // for (TimeTable timeTable : uniqueTimeTables) { // System.out.println(timeTable.getStarttime()); // } // // for (TimeTable timeTable : TeacherTimeTables) { // System.out.println(timeTable.getTeacherName()+"/"+timeTable.getDay()); // } }
// Toast.makeText(getContext(), ""+timeSlots.size(), Toast.LENGTH_SHORT).show(); } }
@Override public void onFailure(Call<ArrayList<TimeTable>> call, Throwable t) { Toast.makeText(getApplicationContext(), ""+t.toString(), Toast.LENGTH_SHORT).show(); } });
}
public void recyclerviewSelectVenueDrowpdown(String venue, Context context) { binding.txtViewSelectedVenue.setText("Selected Venue "+venue); } }
|