Я разрабатываю базовое приложение
в этом приложении - список навыков, которые пользователь может добавить в свой профиль.
то, что я хочу сделать, это:
создать XML-файл для элемента, в который пользователь может ввести все свои данные (готово)
создать настраиваемый адаптер, который может отображать этот XML-файл в виде списка (готово)
создать кнопку, при нажатии которой будет отображаться новый слот элемента, позволяющий пользователю ввести другой навык своего (готового)
проблема в том, что каждый раз, когда я нажимаю кнопку, чтобы добавить новый навык, он стирает все данные, которые были введены в предыдущие слоты навыков. Я уже пробовал использовать onNotifyDataSetChanged, но безрезультатно.
Как я могу программно добавлять новые элементы в список, не стирая данные, которые я установил для всех других элементов
Например, это точно так же, как приложение телефонных контактов, где у каждого контакта может быть несколько телефонных номеров / адресов электронной почты и т. д.
Код адаптера:
package br.com.jobr.jobr.Utils.Adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import br.com.jobr.jobr.Entities.Support.Skill;
import br.com.jobr.jobr.R;
/**
* Created by christian.hess on 13/03/2018.
*/
public class NewSkillAdapter extends ArrayAdapter<Skill> {
Context context;
int resource;
List<Skill> skills;
ListView listSkills;
public NewSkillAdapter(@NonNull Context context, int resource, List<Skill> skills, ListView listSkills) {
super(context, resource, skills);
Log.i("NewSkill", "Numero de item: " + skills.size());
this.resource = resource;
this.context = context;
this.skills = skills;
this.listSkills = listSkills;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View item = inflater.inflate(resource, parent, false);
final Button bt_new_skill = item.findViewById(R.id.bt_new_skill);
final Spinner sp_skill_name = item.findViewById(R.id.sp_skill_name);
final Spinner sp_skill_specialization = item.findViewById(R.id.sp_skill_specialization);
String[] habilityArray = context.getResources().getStringArray(R.array.hability_array);
ArrayAdapter<String> habilityAdapter = new ArrayAdapter<String>(
context, android.R.layout.simple_spinner_item, habilityArray) {
@Override
public boolean isEnabled(int position) {
if (position == 0) {
// Disable the first item from Spinner
// First item will be use for hint
return false;
} else {
return true;
}
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if (position == 0) {
// Set the hint text color gray
tv.setTextColor(Color.GRAY);
} else {
tv.setTextColor(Color.BLACK);
}
return view;
}
};
habilityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_skill_name.setAdapter(habilityAdapter);
String[] especializationArray = context.getResources().getStringArray(R.array.especialization_array);
ArrayAdapter<String> especializationAdapter = new ArrayAdapter<String>(
context, android.R.layout.simple_spinner_item, especializationArray) {
@Override
public boolean isEnabled(int position) {
if (position == 0) {
// Disable the first item from Spinner
// First item will be use for hint
return false;
} else {
return true;
}
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if (position == 0) {
// Set the hint text color gray
tv.setTextColor(Color.GRAY);
} else {
tv.setTextColor(Color.BLACK);
}
return view;
}
};
especializationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_skill_specialization.setAdapter(especializationAdapter);
bt_new_skill.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int size = skills.size();
skills = new ArrayList<>();
for (int i = 0; i < size; i++) {
Skill s = (Skill) listSkills.getAdapter().getItem(i);
skills.add(s);
}
skills.add(new Skill("", "", "", ""));
listSkills.getAdapter().notifyAll();
}
});
return item;
}
}
Пожалуйста, проверьте, как вы работаете с данными за вашим адаптером, возможно, у вас есть List, и похоже, вы каким-то образом удалили все, что уже было там.
Я отправлю код через секунду
Проверьте ответ ниже
Такое поведение наводит меня на мысль, что вы очищаете структуру данных на адаптере каждый раз, когда добавляете новый навык. Можете ли вы опубликовать фрагмент кода адаптера, чтобы мы отладили его визуально?
С уважением,
@Редактировать
Я считаю, что ваша проблема в этой конкретной строке
skills = new ArrayList<>();
внутри твоего
bt_new_skill.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int size = skills.size();
skills = new ArrayList<>();
for (int i = 0; i < size; i++) {
Skill s = (Skill) listSkills.getAdapter().getItem(i);
skills.add(s);
}
skills.add(new Skill("", "", "", ""));
listSkills.getAdapter().notifyAll();
}
});
Как видите, всякий раз, когда вы нажимаете кнопку «bt_new_skill», вы повторно инициализируете ArrayList, тем самым теряя все предыдущие записи. Я не полностью осведомлен о вашем коде в целом, поэтому имейте это в виду, если он не исправит.
Также я рекомендую вам использовать
listSkills.getAdapter().notifyDataSetChanged();
вместо
listSkills.getAdapter().notifyAll();
поскольку первый является официальным методом обновления набора данных адаптера
это сработало, я понял только после повторной инициализации массива
Не могли бы вы опубликовать код, отображающий ваш список, пожалуйста?