单击按钮获取当前选定的列表视图项微调器
Getting currently selected listview item spinner on button click
我正在创建一个应用程序,其中包含一个问题列表,每个问题都有多个答案选项。为此,我使用了一个列表视图,每个项目都包含一个 TextView,用于显示带有包含答案列表的微调器的问题。我正在尝试检索每个列表视图项中微调器的当前选定值。这通常很容易,除了我为每个列表视图项目都有一个微调器并且我需要的微调器数量是 "unknown" 直到加载问题数量。
我的问题是如何获取每个当前选定的微调项的值。目前我只能获得第一个微调项的值。下面是我使用自定义适配器的 class 代码:
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;
}
如有任何帮助,我们将不胜感激。
首先,您需要定义一个接口,以便您的适配器 class 可以用来告诉父级 class 从 position[= 的微调器中选择了哪个项目29=] 什么是 selectedItem
OnSpinnerItemSelected 接口
public interface OnSpinnerItemSelected {
void onItemSelected(int position, String selectedItem);
}
然后你需要在你的适配器构造函数中传递一个 OnSpinnerItemSelected 对象。
private OnSpinnerItemSelected onSpinnerItemSelected;
public CompQuestionsAdapter(......, OnSpinnerItemSelected onSpinnerItemSelected) {
this.onSpinnerItemSelected = onSpinnerItemSelected;
}
在使用自定义适配器的 class 中添加:
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) {
}
});
如果不清楚请告诉我。
我正在创建一个应用程序,其中包含一个问题列表,每个问题都有多个答案选项。为此,我使用了一个列表视图,每个项目都包含一个 TextView,用于显示带有包含答案列表的微调器的问题。我正在尝试检索每个列表视图项中微调器的当前选定值。这通常很容易,除了我为每个列表视图项目都有一个微调器并且我需要的微调器数量是 "unknown" 直到加载问题数量。
我的问题是如何获取每个当前选定的微调项的值。目前我只能获得第一个微调项的值。下面是我使用自定义适配器的 class 代码:
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;
}
如有任何帮助,我们将不胜感激。
首先,您需要定义一个接口,以便您的适配器 class 可以用来告诉父级 class 从 position[= 的微调器中选择了哪个项目29=] 什么是 selectedItem
OnSpinnerItemSelected 接口
public interface OnSpinnerItemSelected {
void onItemSelected(int position, String selectedItem);
}
然后你需要在你的适配器构造函数中传递一个 OnSpinnerItemSelected 对象。
private OnSpinnerItemSelected onSpinnerItemSelected;
public CompQuestionsAdapter(......, OnSpinnerItemSelected onSpinnerItemSelected) {
this.onSpinnerItemSelected = onSpinnerItemSelected;
}
在使用自定义适配器的 class 中添加:
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) {
}
});
如果不清楚请告诉我。