如何在选择第一个微调器的基础上更改其他微调器的值



我正试图在从程序名称中选择值时更改课程名称和课程部分的值。当我选择程序名称时,所选程序的课程名称显示在课程名称微调器中,同时课程部分微调器将填充所选课程名称的部分。但当我更改程序名称时,课程名称微调器也会更新自己,但课程部分微调器不会用默认选择的课程的部分更新自己,直到或除非我从课程名称中选择任何其他值。

下面是活动xml的图片:

活动的xml图片

下面是我的firebase数据库结构:

Courses Details" : {
"Bs-BBA" : {
"-MVuhKkfxjHkZmTfsITM" : {
"Economics" : {
"courseName" : "Economics",
"courseSection" : "A",
"dayOfCourse" : "Tuesday",
"endingTime" : "1:30Pm",
"programName" : "Bs-BBA",
"startingTime" : "12:00Pm"
}
},
"-MWwNgr6yT8b0ARo86DN" : {
"Human resource Management" : {
"courseName" : "Human resource Management",
"courseSection" : "G",
"dayOfCourse" : "Thursday",
"endingTime" : "7:00AM",
"programName" : "Bs-BBA",
"startingTime" : "6:00AM"
}
}
},
"Bscs" : {
"-MVWl1uq9fA4AlYRfMIv" : {
"Data structure" : {
"courseName" : "Data structure",
"courseSection" : "B",
"dayOfCourse" : "Monday",
"endingTime" : "9:30AM",
"programName" : "Bscs",
"startingTime" : "8:00AM"
}
},
"-MVY9hGxrp8Lz4JTOefy" : {
"OOP" : {
"courseName" : "OOP",
"courseSection" : "C",
"dayOfCourse" : "Thursday",
"endingTime" : "9:00AM",
"programName" : "Bscs",
"startingTime" : "10:00AM"
}
},
"-MVYHM0c7cMLersoUl2i" : {
"Marketing Fundamental" : {
"courseName" : "Marketing Fundamental",
"courseSection" : "D",
"dayOfCourse" : "Thursday",
"endingTime" : "9:00AM",
"programName" : "Bscs",
"startingTime" : "11:00AM"
}
}
},
"Bsse" : {
"-MVYHB3X_d4UozbBUDa3" : {
"Marketing Fundamental" : {
"courseName" : "Marketing Fundamental",
"courseSection" : "E",
"dayOfCourse" : "Thursday",
"endingTime" : "9:00AM",
"programName" : "Bsse",
"startingTime" : "2:00AM"
}
}
},
"Mscs" : {
"-MWg6Ua5E9x9dSJ31552" : {
"MoT" : {
"courseName" : "MoT",
"courseSection" : "F",
"dayOfCourse" : "Wednesday",
"endingTime" : "10:00AM",
"programName" : "Mscs",
"startingTime" : "3:00AM"
}
},
"-MWrD3bp9t2kt4Ze40-D" : {
"Advance Data Structure" : {
"courseName" : "Advance Data Structure",
"courseSection" : "G",
"dayOfCourse" : "Thursday",
"endingTime" : "1:00Pm",
"programName" : "Mscs",
"startingTime" : "5:00AM"
}
}
}
},

这是我的java代码,用于填充和选择微调器值:

// populating spinner for Course program
spinnerForProgramName = findViewById(R.id.course_program);
spinnerForProgramNameArrayList = new ArrayList<>();
spinnerForProgramNameArrayAdapter =new ArrayAdapter<String>(AssignCoursesToFaculty.this, android.R.layout.simple_spinner_dropdown_item, spinnerForProgramNameArrayList);
spinnerForProgramName.setAdapter(spinnerForProgramNameArrayAdapter);
getDataIntoSpinnerForProgramNameFromFirebase();

// Populating spinner for Course Name
spinnerForCourseName = findViewById(R.id.course_name) ;
spinnerForCourseNameArrayList = new ArrayList<>();
spinnerForCourseNameArrayAdapter =new ArrayAdapter<String>(AssignCoursesToFaculty.this, android.R.layout.simple_spinner_dropdown_item, spinnerForCourseNameArrayList);
spinnerForCourseName.setAdapter(spinnerForCourseNameArrayAdapter);

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

// Populating spinner For Course Sec
spinnerForCourseSection = findViewById(R.id.course_sec) ;
spinnerForCourseSecArrayList = new ArrayList<>();
spinnerForCourseSecArrayAdapter =new ArrayAdapter<String>(AssignCoursesToFaculty.this, android.R.layout.simple_spinner_dropdown_item, spinnerForCourseSecArrayList);
spinnerForCourseSection.setAdapter(spinnerForCourseSecArrayAdapter);

// Populating spinner For Course Starting Time
spinnerForCourseStartingTime = findViewById(R.id.course_start_time) ;
spinnerForCourseStartingTimeArrayList = new ArrayList<>();
spinnerForCourseStartingTImeArrayAdapter =new ArrayAdapter<String>(AssignCoursesToFaculty.this, android.R.layout.simple_spinner_dropdown_item, spinnerForCourseStartingTimeArrayList);
spinnerForCourseStartingTime.setAdapter(spinnerForCourseStartingTImeArrayAdapter);

spinnerForCourseName.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
getDataIntoSpinnerCourseSec();
//getDataIntoSpinnerStartingTime();
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
});

public void getDataIntoSpinnerForProgramNameFromFirebase()
{
dbRef = FirebaseDatabase.getInstance().getReference().child("Courses Details");
listener = dbRef.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
spinnerForProgramNameArrayList.clear();
for( DataSnapshot courseDetails:snapshot.getChildren() )
{
String programAndDepartmentNameKey = courseDetails.getKey();
spinnerForProgramNameArrayList.add(programAndDepartmentNameKey);
}
spinnerForProgramNameArrayAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{

}
});
}
public void getDataIntoSpinnerCourseName()
{
String selectedValueFromSpinnerProgramName = spinnerForProgramName.getSelectedItem().toString() ;
ValueEventListener listener;
final DatabaseReference rootRef;
rootRef = FirebaseDatabase.getInstance().getReference().child("Courses Details");
listener = rootRef.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if( snapshot.child(selectedValueFromSpinnerProgramName).exists() )
{
spinnerForCourseNameArrayList.clear();
for( DataSnapshot programNameKey: snapshot.child(selectedValueFromSpinnerProgramName).getChildren() )
{
for( DataSnapshot courseNameKey : programNameKey.getChildren() )
{
String courseName = courseNameKey.getKey() ;
spinnerForCourseNameArrayList.add(courseName);
}
}
spinnerForCourseNameArrayAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
public void getDataIntoSpinnerCourseSec()
{
String selectedValueFromSpinnerProgramName = spinnerForProgramName.getSelectedItem().toString() ;
String selectedValueFromSpinnerCourseName = spinnerForCourseName.getSelectedItem().toString() ;
ValueEventListener listener;
final DatabaseReference rootRef;
rootRef = FirebaseDatabase.getInstance().getReference().child("Courses Details");
listener = rootRef.addValueEventListener( new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
spinnerForCourseSecArrayList.clear();
for (DataSnapshot programNameKey : snapshot.child(selectedValueFromSpinnerProgramName).getChildren())
{
for (DataSnapshot randomIdKey : programNameKey.getChildren())
{
String courseName = randomIdKey.getKey();
if( randomIdKey.child(courseName).getKey().equals(selectedValueFromSpinnerCourseName) )
{
for (DataSnapshot courseNameKey : randomIdKey.getChildren())
{
String courseNameDetail = courseNameKey.getKey();
if ( courseNameKey.child(courseNameDetail).getKey().equals("courseSection") )
{
spinnerForCourseSecArrayList.add(courseNameKey.getValue().toString());
}
}
}

}
}
spinnerForCourseSecArrayAdapter.notifyDataSetChanged();

}

@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
}

根据您的代码,当课程名称被选择为CCD_ 1被写入CCD_ 3的CCD_。

要修复它,您可以将getDataIntoSpinnerCourseSec()移动到spinnerForProgramNameonItemSelected

spinnerForProgramName.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
getDataIntoSpinnerCourseName();
getDataIntoSpinnerCourseSec();
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
});

看看下面的例子,我只是为了解决您的问题。为了便于理解,我没有使用您的Firebase数据,而是创建了伪数据。我希望你们能从下面的例子中得到解决问题的线索。

public class MultiSpinnerTestActivity extends AppCompatActivity {
interface CommonItem{
String getName();
List<CommonItem> getList();
}
private class Item implements CommonItem{
String itemName;
Item(String itemName){
this.itemName = itemName;
}
@Override
public String getName() {
return itemName;
}
@Override
public List<CommonItem> getList() {
return null;
}
}
private class SubCategory implements CommonItem{
String subCategoryName;
List<CommonItem> items;
SubCategory(String subCategoryName, List<CommonItem> itemList){
this.subCategoryName = subCategoryName;
this.items = itemList;
}
@Override
public String getName() {
return subCategoryName;
}
@Override
public List<CommonItem> getList() {
return items;
}
}
private class Category implements CommonItem{
String categoryName;
List<CommonItem> subCategories;
Category(String categoryName, List<CommonItem> subCategoryList){
this.categoryName = categoryName;
this.subCategories = subCategoryList;
}
@Override
public String getName() {
return categoryName;
}
@Override
public List<CommonItem> getList() {
return subCategories;
}
}
ArrayList<CommonItem> categoryArrayList = new ArrayList<>();
ArrayList<CommonItem> subCategories = new ArrayList<>();
ArrayList<CommonItem> items = new ArrayList<>();
Spinner spinner1,spinner2,spinner3;
ArrayAdapter spinner1Adapter,spinner2Adapter,spinner3Adapter;
int currentCategory = 0, currentSubCategory = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multi_spinner_test);
spinner1 = findViewById(R.id.spinner_1);
spinner2 = findViewById(R.id.spinner_2);
spinner3 = findViewById(R.id.spinner_3);
// Just creating sample nested list. Category contains SubCategory, SubCategory contains Item.
for (int i = 0; i < 5; i++){
subCategories = new ArrayList<>();
for (int j = 0; j < 4; j++){
items = new ArrayList<>();
for (int m = 0; m < 5; m++){
items.add(new Item("Item"+i+j+m));
}
subCategories.add(new SubCategory("Sub Category"+i+ j,items));
}
categoryArrayList.add(new Category("Category "+i,subCategories));
}
//spinner1Adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, categoryArrayList);
spinner1Adapter = new CustomSpinnerAdapter(this, categoryArrayList);
spinner1.setAdapter(spinner1Adapter);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
resetSpinner2(categoryArrayList.get(position).getList());
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
});
spinner1.setSelection(0);
}
private void resetSpinner2(List<CommonItem> subCategories){
//spinner2Adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, subCategories);
spinner2Adapter = new CustomSpinnerAdapter(this, subCategories);
spinner2.setAdapter(spinner2Adapter);
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
resetSpinner3(subCategories.get(position).getList());
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
});
spinner2.setSelection(0);
}
private void resetSpinner3(List<CommonItem> itemList){
//spinner3Adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, itemList);
spinner3Adapter = new CustomSpinnerAdapter(this, itemList);
spinner3.setAdapter(spinner3Adapter);
spinner3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
Log.d("Tag==>>","Selected Item = "+itemList.get(position).getName());
}
@Override
public void onNothingSelected(AdapterView<?> parent) { }
});
spinner3.setSelection(0);
}
class CustomSpinnerAdapter extends ArrayAdapter<CommonItem> {
Context context;
List<CommonItem> itemList;
public CustomSpinnerAdapter(@NonNull Context context, @NonNull List<CommonItem> objects) {
super(context, 0, objects);
this.context = context;
this.itemList = objects;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup){
return createView(position,view,viewGroup);
}
@Override
public View getDropDownView(int position, View view, @NotNull ViewGroup viewGroup){
return createView(position,view,viewGroup);
}
private View createView(int position, View view, ViewGroup viewGroup){
View itemView = LayoutInflater.from(context).inflate(R.layout.custom_spinner_item_view,viewGroup,false);
TextView textView = itemView.findViewById(R.id.spinner_item_tv);
textView.setText(itemList.get(position).getName());
return itemView;
}
}
}

activity_multi_spinner_test.xml

<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"
tools:context=".MultiSpinnerTestActivity"
android:orientation="vertical">
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:id="@+id/spinner_1"/>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:id="@+id/spinner_2"/>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:id="@+id/spinner_3"/>
</LinearLayout>

custom_spinner_item_view.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:id="@+id/spinner_item_tv"
android:textAppearance="?android:attr/textAppearanceListItem"
android:textColor="?android:attr/textColorPrimary"
android:padding="5dp">

最新更新