I want get items on RecyclerView based on the student class selected in the spinner. The student has rollno,name, class to be displayed in the RecyclerView. For instance, I want students in class 8th. I am using firebase Firestore. Right now I have recyclerviw which fetches all the documents(students).
Updated Code for Adapter is :
public class ClasswiseAdapter extends RecyclerView.Adapter<ClasswiseAdapter.studentViewHolder>{
private ArrayList<ModelViewClasswise> classlist;
private ArrayList<ModelViewClasswise> newClassList;
public ClasswiseAdapter(ArrayList<ModelViewClasswise> classlist) {
this.classlist = classlist;
}
public void addnewList(ArrayList<ModelViewClasswise> newClassList){
this.classlist = newClassList;
notifyDataSetChanged();
}
@NonNull
@Override
public ClasswiseAdapter.studentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.row_classwise,parent,false);
return new ClasswiseAdapter.studentViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull studentViewHolder holder, int position) {
holder.t1.setText(classlist.get(position).getName());
holder.t2.setText(classlist.get(position).getClassName());
holder.t3.setText(classlist.get(position).getRollNumber());
}
@Override
public int getItemCount() {
return classlist.size();
}
class studentViewHolder extends RecyclerView.ViewHolder{
TextView t1,t2,t3;
public studentViewHolder(@NonNull View itemView) {
super(itemView);
t1=itemView.findViewById(R.id.nameC);
t2=itemView.findViewById(R.id.classC);
t3=itemView.findViewById(R.id.rollNumC);
}
}
}
And updated code for ClassView for students is:
public class ViewClasswise extends AppCompatActivity {
private static final String TAG = ViewClasswise.class.getSimpleName();
private RecyclerView recyclerViewCW;
ArrayList<ModelViewClasswise>classlist;
FirebaseFirestore db;
FirebaseAuth fAuth;
ClasswiseAdapter classwiseAdapter;
Spinner s1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_classwise);
recyclerViewCW = findViewById(R.id.recyclerviewCW);
recyclerViewCW.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
recyclerViewCW.setLayoutManager(new LinearLayoutManager(this));
classlist=new ArrayList<>();
classwiseAdapter=new ClasswiseAdapter(classlist);
recyclerViewCW.setAdapter(classwiseAdapter);
s1=findViewById(R.id.spinnerSearch);
db= FirebaseFirestore.getInstance();
fAuth= FirebaseAuth.getInstance();
FirebaseUser user = fAuth.getCurrentUser();
//spinner Listener
s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
{
// this returns the class the user selected
String selectedClass = (String) parentView.getItemAtPosition(position);
classwiseAdapter.addnewList(listForClass(selectedClass));
}
@Override
public void onNothingSelected(AdapterView<?> parentView)
{
}
// function to filter the list based on the users choice
private ArrayList<ModelViewClasswise> listForClass(String selectedClass){
ArrayList<ModelViewClasswise> newList = new ArrayList<>();
for(ModelViewClasswise modelClass : classlist){
if(modelClass.getClass().equals(selectedClass))
newList.add(modelClass);
}
return newList;
}
});
db.collection("Schools").document(user.getUid()).collection("Students").get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
List<DocumentSnapshot> list=queryDocumentSnapshots.getDocuments();
for(DocumentSnapshot d:list){
ModelViewClasswise obj=d.toObject(ModelViewClasswise.class);
classlist.add(obj);
}
//Update Adapter
classwiseAdapter.notifyDataSetChanged();
}
});
}
}
Advertisement
Answer
Start with adding a function addNewList in your adapter class to update the classlist based on the user’s choice
Adapter class
public void addnewList(ArrayList<ModelViewClasswise> newClassList){
this.classlist = newClassList;
notifyDataSetChanged()
}
Main activity
// assuming you have initialized the spinner with the data to show
yourSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
{
// this returns the class the user selected
String selectedClass = parentView.getItemAtPosition(position);
classwiseAdapter.addnewList(listForClass(selectedClass))
}
@Override
public void onNothingSelected(AdapterView<?> parentView)
{
}
});
// function to filter the list based on the users choice
private ArrayList<ModelViewClasswise> listForClass(String selectedClass){
ArrayList<ModelViewClasswise> newList = new ArrayList<>();
for(ModelViewClasswise modelClass : classlist){
if(modelClass.getClass().equals(selectedClass))
newList.add(modelClass);
}
return newList;
}
Edit:
// add this after fetching all the objects from the Firebase Firestore classwiseAdapter.addnewList(classlist);