Код для счетчика приведен ниже. Счетчики в моем приложении имеют тенденцию дублировать его содержимое иногда по какой-то странной причине. Как мне этого не допустить ?:
Spinner spinnerG = (Spinner) findViewById(R.id.spGroup);
final ArrayAdapter<String> dataAdapterG = new ArrayAdapter<>
(this, R.layout.simple_spinner_item, groups);
dataAdapterG.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinnerG.setAdapter(dataAdapterG); //general basics //sets up the group spinner, filled with the groups list
spinnerG.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
selectedGroup = groups.get(position);
studentsToShow.clear();
for(int i = 0; i < studList.size(); i++){
if (studList.get(i).getGroup().equals(selectedGroup)){
Students a = new Students();
a.setFirstName(studList.get(i).getFirstName());
a.setLastName(studList.get(i).getLastName());
a.setStudentID(studList.get(i).getStudentID());
a.setGroup(studList.get(i).getGroup());
studentsToShow.add(a); //when a new group is chosen the list of students in the selected group needs to be updated
} //this re uses the code earlier to make a list of student in the selected group
}
updateSpS(); //updates the student spinner
}
public void onNothingSelected(AdapterView<?> parent){
}
});
Сделайте это перед обновлением счетчика: 1- Create -> HashSet <Students> hashSet = new HashSet <> (); 2- Добавьте все элементы в hashSet -> hashSet.addAll (studentToShow); 3- Очистить список -> studentToShow.clear (); 4- Добавьте hashSet в список -> studentToShow.addAll (hashSet); 5- Вызов spinnerAdapter.notifyDataSetChanged ();




Счетчик будет дублироваться, если вы поместили это событие oncreate. Поместите код популяции счетчика на метод onResume.
Из фрагмента, к которому был подан вопрос, трудно догадаться, почему OP может иметь повторяющееся значение. Обоснованное предположение состоит в том, что его onItemSelected () вызывается несколько раз.
Spinner's (на мой взгляд, это один из худших виджетов для Android) onItemSelected() можно вызывать несколько раз по разным причинам, одна из вещей, которые я бы рекомендовал попробовать таким образом -
class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {
boolean userSelect = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
userSelect = true;
return false;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if (userSelect) {
// Your selection handling code here
userSelect = false;
if (view!=null){
selectedGroup = groups.get(position);
studentsToShow.clear();
for(int i = 0; i < studList.size(); i++){
if (studList.get(i).getGroup().equals(selectedGroup)){
Students a = new Students();
a.setFirstName(studList.get(i).getFirstName());
a.setLastName(studList.get(i).getLastName());
a.setStudentID(studList.get(i).getStudentID());
a.setGroup(studList.get(i).getGroup());
studentsToShow.add(a); //when a new group is chosen the list of students in the selected group needs to be updated
} //this re uses the code earlier to make a list of student in the selected group
}
updateSpS(); //updates the student spinner
}
}
}
}
А затем установите -
SpinnerInteractionListener listener = new SpinnerInteractionListener();
spinnerG.setOnTouchListener(listener);
spinnerG.setOnItemSelectedListener(listener);
Это в то же время заботится о нежелательных обратных вызовах onItemSelected () без вмешательства пользователя и в случае каких-либо предыдущих просочившихся слушателей.
Да, у меня есть 3 прядильщика в одном действии, если это помогает в вопросе, все дублируются после многократного открытия счетчика
Это помогло? @Виктор?
вы набираете студентов в каждом из них?
Привет, Амит, я попробую и дам тебе знать
для какого обратного вызова жизненного цикла Activity / Fragment вы установили этот
Spinner?