Spin ner中来自TreeMap的显示项目

问题描述 投票:0回答:1

我正在一个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.
java android android-studio spinner treemap
1个回答
0
投票

关于这个,首先使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;
}
© www.soinside.com 2019 - 2024. All rights reserved.