我正在一个android studio项目中工作,该项目涉及将一堆对象放入微调器中。对象位于TreeMap中。我尝试使用几种不同的方法在微调器中显示这些对象,但我要么使应用程序崩溃,要么在一行中显示了整个TreeMap,这不是我想要的。我只想在微调器中显示对象的标题。这是代码:
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeMap;
public class CreateSchedule extends AppCompatActivity {
private TreeMap<String, Course> courseMap;
private ArrayList<TreeMap<String, Course>> courseItems = new ArrayList<>();
private Spinner courseSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_schedule);
courseMap = new TreeMap<>();
createCourseList(this);
//my first approach that I tried with hints from the Android Studio itself but this just displays an entire map which is not what I need
courseSpinner = findViewById(R.id.spinner1);
ArrayAdapter<TreeMap<String, Course>> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Collections.singletonList(courseMap));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
courseSpinner.setAdapter(adapter);
}
//Second approach: set spinner data is what I tried later but this just crashes the app
public void setSpinnerData() {
courseSpinner = findViewById(R.id.spinner1);
ArrayAdapter<Course> adapter = new ArrayAdapter<Course>(this, android.R.layout.simple_spinner_item, (List<Course>) courseMap);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
courseSpinner.setAdapter(adapter);
}
//This method populates the tree map from a text file with object of type Course
public void createCourseList(Context context) {
try {
InputStream is = context.getAssets().open("courses.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
Course course = new Course();
while ((line = br.readLine()) != null) {
if (!line.trim().isEmpty()) {
if (course.getCRN() == null) {
course.setCRN(line.trim());
} else if (course.getName() == null) {
course.setName(line.trim());
} else if (course.getDescription() == null) {
course.setDescription(line.trim());
} else {
String c = line.trim();
double credit = Double.parseDouble(c);
course.setCredits(credit);
courseMap.put(course.getCRN(), course);
}
} else {
course = new Course();
}
}
//Some test prints to check if map is filled
//System.out.println(courseMap.size());
//System.out.println(courseMap.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
课程类只包含课程CRN,名称,描述和学分以及toString方法等字段。我想用地图中的课程填充微调器,并仅显示课程CRN(CRN是名称和代码,例如:ART101)。但这是反对的,因为我以后需要从微调器中获取适当的值(例如功劳)。任何提示和技巧都将不胜感激
编辑:如果我使用setSpinnerData()方法,这是我收到的崩溃消息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: coda759.schedulebuilder, PID: 8685
java.lang.RuntimeException: Unable to start activity ComponentInfo{coda759.schedulebuilder/coda759.schedulebuilder.CreateSchedule}: java.lang.ClassCastException: java.util.TreeMap cannot be cast to java.util.List
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.ClassCastException: java.util.TreeMap cannot be cast to java.util.List
at coda759.schedulebuilder.CreateSchedule.setSpinnerData(CreateSchedule.java:42)
at coda759.schedulebuilder.CreateSchedule.onCreate(CreateSchedule.java:37)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 8685 SIG: 9
Process 8685 terminated.
关于这个,首先使courseCrnList成为该类的成员,同时还要使courseMap成为一个成员
private List<String> courseCrnList;
private Map<String, Course> courseMap;
然后您以这种方式显示了
courseCrnList = new ArrayList<String>();
for(Map.Entry<String, Course> entry : courseMap.entrySet()) {
courseCrnList.add(entry.getKey());
}
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, courseCrnList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(courseCrnList != null && courseCrnList.size() > 0) {
Course course = getCourseFromCrn(courseCrnList.get(position));
if(course != null) {
// do some work here with this course
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// do nothink xD
}
});
以及稍后使用此方法通过crn检索课程
private Course getCourseFromCrn(String crn) {
for(Map.Entry<String, Course> entry : courseMap.entrySet()) {
if(entry.getKey().trim().equals(crn.trim()))
return entry.getValue();
}
// crn not in this map
return null;
}