【问题标题】:Getting currently selected listview item spinner on button click在按钮单击时获取当前选定的列表视图项目微调器
【发布时间】:2017-03-21 17:53:36
【问题描述】:

我正在创建一个应用程序,该应用程序包含一个功能,其中包括一个问题列表,每个问题都有多个答案选项。为此,我使用了一个列表视图,其中每个项目都包含一个 TextView,用于显示问题,其中包含一个包含答案列表的微调器。我正在尝试检索每个列表视图项中当前选定的微调器值。这通常很容易,除了我为每个列表视图项都有一个微调器并且在加载问题数量之前我需要的微调器数量是“未知的”。

我的问题是如何获取每个当前选定的微调器项目的值。目前我只能获得第一个微调项目的价值。下面是使用我的自定义适配器的类的代码:

questionsList = new ArrayList<>();
    masterAnswersList = new ArrayList<>();
    //For all questions with the tech answer's group id, get questions
    for(int k = 0; k < allQuestions.size(); k++) {
        final int z = k;
        //Each question for the tech
        System.out.println("Question " + z + " " + allQuestions.get(z).getQuestionTitle());
        questionsList.add(new CompleteQuestions.ListViewItem() {{
            QUESTION = allQuestions.get(z).getQuestionTitle();
        }});

        int questionId = allQuestions.get(z).getQuestionId();
        //Get all possible answers for this question based on the question and the group id
        allAnswers = db.getAllGroupAnswers(questionId, groupID, database);
        answersList = new ArrayList<>();
        //For all answers for this question, add to arraylist
        for(int j = 0; j < allAnswers.size(); j++) {
            final int p = j;
            answersList.add(new CompleteQuestions.ListViewItem() {{
                ANSWER = allAnswers.get(p).getAnswerTitle().trim();
            }});
        }
        masterAnswersList.add(answersList);
    }
    adapter = new CompQuestionsAdapter(this, questionsList, masterAnswersList);
    completeQuestionsListView.setAdapter(adapter);


//For the number of items in the listview
                for (int i = 0; i < completeQuestionsListView.getCount(); i++) {
                    //Update ticket questions table
                    String techChoice = CompQuestionsAdapter.spinner.getSelectedItem().toString();
                    System.out.println("techChoice: " + techChoice);
                    //Get id of answer tech chose
                    int techAnswerId = db.getAnswerId(techChoice, database);
                    int questionId = allQuestions.get(i).getQuestionId();
                    int groupId = db.getGroupId(techChoice, questionId, database);
                    System.out.println("Group id: " + groupId);
                    Ticket questionTicket = new Ticket(questionId, techAnswerId, ticketId, companyId, groupId, true);
                    db.addTicketQuestionResponse(questionTicket, context, database);
                }

以及自定义适配器本身的一部分:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    /**
     * The database used to pull all ticket information
     */
    final DatabaseHandler db = new DatabaseHandler(context);
    final SQLiteDatabase database = db.getReadableDatabase();

    ListViewItem item = questions.get(position);
    //ListViewItem item2 = answers.get(position).get(position);
    View vi=convertView;

    if(convertView==null)
        vi = inflater.inflate(R.layout.comp_questions_view, null);

    TextView question = (TextView)vi.findViewById(R.id.QUESTION);
    question.setText("" + item.QUESTION);

    spinner = (Spinner)vi.findViewById(R.id.ANSWERS);
    List<String> strAnswers = new ArrayList<>();
    List<CompleteQuestions.ListViewItem> currentAnswers = answers.get(position);
    for (int i = 0; i < currentAnswers.size(); i++) {
        strAnswers.add(currentAnswers.get(i).ANSWER);
    }
    //Place all the cleared by codes in a string array used to populate the spinner
    String[] strArrayAnswers = new String[strAnswers.size()];
    for(int i = 0; i < strAnswers.size(); i++) {
        if(strAnswers.get(i) != null) {
            strArrayAnswers[i] = strAnswers.get(i);
        }
    }
    adapter = new ArrayAdapter<>(context,
            android.R.layout.simple_spinner_item, strArrayAnswers);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    List<String> selections = new ArrayList<>();
    selections.add(spinner.getSelectedItem().toString());
    System.out.println("Currently selected item: " + spinner.getSelectedItem());

    return vi;
}

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: android listview android-spinner custom-adapter


    【解决方案1】:

    首先,您需要定义一个接口,以便您的适配器类可以用来告诉父类从 position 的微调器中选择了哪个项目,以及 selectedItem 是什么强>

    OnSpinnerItemSelected 接口

    public interface OnSpinnerItemSelected {
        void onItemSelected(int position, String selectedItem);
    }
    

    那么你需要在你的适配器构造函数中传递一个 OnSpinnerItemSelected 对象。

    private OnSpinnerItemSelected onSpinnerItemSelected;
    
    public CompQuestionsAdapter(......, OnSpinnerItemSelected onSpinnerItemSelected) {
        this.onSpinnerItemSelected = onSpinnerItemSelected;
    }
    

    在使用自定义适配器的类中添加:

        adapter = new CompQuestionsAdapter(this, questionsList, masterAnswersList, new OnSpinnerItemSelected() {
            @Override
            public void onItemSelected(int position, String selectedItem) {
    
            }
        });
    

    在您的适配器中调用 onItemSelected 方法(在 getView 方法中)

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    
                onSpinnerItemSelected.onItemSelected(position, adapterView.getAdapter().getItem(i));
    
            }
    
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
    
            }
        });
    

    如果不清楚,请告诉我。

    【讨论】:

    • 我有一个问题:如何在按下按钮时调用的 onClickListener 中调用它?
    • 没关系,我想通了。非常感谢,我花了太多时间在这上面!
    • 我知道这是一个不同的问题,但如果可能的话,您能否看看这个问题:stackoverflow.com/questions/42427659/…?如果不是那也没关系,但这是一个有点相似的话题。
    猜你喜欢
    • 2013-12-30
    • 2013-06-20
    • 1970-01-01
    • 2012-06-24
    • 2021-12-15
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多