#java #android #arraylist
#java #Android #arraylist
Вопрос:
Мне удалось преобразовать arraylist некоторого класса (в моем случае это класс, который расширяется ArrayAdapter<Question>
) в ArrayList<String>
. Я передал его через пакет Android intent и получил с помощью метода getStringArrayList. Теперь мне нужно преобразовать его обратно в ArrayList<Question>
, чтобы настроить мой адаптер
Преобразование из ArrayList<Question>
в ArrayList<String>
questionlists = task.execute(myitem).get();
for (Question object : questionlists)
{
strings.add(object != null ? object.toString() : null);
}
simpleArray2 = new String[strings.size()];
strings.toArray(simpleArray2);
Преобразование обратно в ArrayList<Question>
List<Question> variable;
lists = getArguments().getStringArrayList("Question");
variable = (List<Question>)(List<?>) lists;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_world, container, false);
ListView lv = (ListView) view.findViewById(R.id.list_sessions);
final QuestionAdapter adapter = new QuestionAdapter(getActivity(), variable);
lv.setAdapter(adapter);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(
//inflater.getContext(), android.R.layout.simple_list_item_1,
//lists);
// lv.setAdapter(adapter);
return view;
}
Я добавил попытку / перехватить свой адаптер, и я получаю ошибку:
java.lang.Строка не может быть преобразована в java.com.example.Вопрос.
Что я делаю не так? Это потому, что я сначала не преобразовал обратно в правильный ArrayList?
Комментарии:
1.
variable = (List<Question>)(List<?>) lists;
что за. Это не сработает.2. Именно здесь я пытаюсь преобразовать arraylist<String>, который я передал через мой вызов putStringArrayList , в ArrayList вопросов, чтобы я мог отобразить его в моем адаптере
3.
List<Question>
это не то же самое, чтоList<String>
потомуQuestion
, что это не то же самое, чтоString
. Вы должны создатьQuestion
классParcelable
, используя parcelabler.com и отправьте массив Parcelable вместо String.
Ответ №1:
В вашем первом примере вы на самом деле не приводите a Question
к a String
. Вы вызываете toString()
метод для Question
.
Например,
public class Question {
//instance member
String question;
public String toString() {
return question;
}
}
Чтобы перейти от a String
к a Question
, вам придется написать конструктор или метод, который принимает String
в качестве параметра и возвращает Question
.
Например, вы могли бы добавить этот конструктор в свой Question
класс:
public Question(string myQuestion) {
question = myQuestion;
}
Комментарии:
1. Как бы вы посоветовали мне это сделать? В моем первом примере strings — это массив из строк.
2. @user1397978 Надеюсь, мое обновление поможет объяснить ситуацию.
Ответ №2:
Хорошо. Для преобразования из List<Question>
в List<String>
вы уже делаете это:
Преобразование из ArrayList в ArrayList
List<Question> questionlists = task.execute(myitem).get();
List<String> strings = new ArrayList<String>();
for (Question object : questionlists)
{
strings.add(object != null ? object.toString() : null);
}
Теперь, чтобы преобразовать из List<String>
в List<Question>
, вам нужно будет сделать точно то же самое, только наоборот:
List<String> strings = ... result from above
List<Question> questionlists = new ArrayList<Question>();
for (String object : strings)
{
questionlists.add(object != null ? object.toQuestion() : null);
}
О, подождите! String
не имеет toQuestion()
метода! Что теперь? Ну, мы просто создаем такой метод сами. Поскольку это будет метод, создающий Question
объект, почему бы не сделать его конструктором Question, принимая строку в качестве параметра?
List<String> strings = ... result from above
List<Question> questionlists = new ArrayList<Question>();
for (String object : strings)
{
questionlists.add(object != null ? new Question(object) : null);
}
Теперь все, что осталось сделать, это добавить этот конструктор в ваш класс вопросов.
class Question {
public Question(String string) {
// implementing this the right way is up to you...
}
}
Комментарии:
1. Спасибо! Казалось, это очень помогло и имеет такой смысл!
Ответ №3:
toString()
это метод, который есть у всех объектов Java Object
. По умолчанию в нем будет указано имя класса и местоположение ссылки в памяти. На самом деле вы не преобразуете объект Question
в String
. Вы генерируете String
то, что в некотором what интерпретирует то, что Question
есть. Например, вы можете перезаписать toString()
, чтобы сгенерировать все, что захотите.
public class Question {
String mQuestion;
@Override
public String toString() {
return mQuestion;
}
}
Теперь, что вы можете сделать, это создать какую-то пользовательскую строку в, toString()
которая полностью представляет ваш Question
объект. Затем создайте fromString
метод, который анализирует вашу пользовательскую строку и создает из нее новые Question
объекты. Однако этот метод подвержен ошибкам и имеет ограничения.
Лучшим методом было бы либо наследование Question
от Serializable
, либо, что еще лучше, разделяемое. Выполнение этого позволяет вам поместить фактический Question
объект в пакет и извлечь его из намерения без какого-либо преобразования.
Ответ №4:
Вы должны правильно понимать приведение типов.
Приведение типов не является преобразованием. Он просит java предположить для остальной части этого контекста, что реальный тип этого объекта является тем, что вы говорите. Вы говорите java, что, хотя это не очевидно в текущем контексте, вы лучше знаете, каков фактический тип объекта.
Информация о точном типе объекта доступна не во всех контекстах. При передаче объектов методы обрабатывают их как любой из своих типов суперклассов вплоть до Object .
Приведение типов — это способ сообщить java, что «Я уже знаю, что это список<Вопрос>, потому что я знаю, кто поместил туда этот объект».
Таким образом, приведение типов не может помочь с преобразованием. Объект уже должен быть такого типа, чтобы приведение к типу работало.
Если это другой тип, вам придется написать код для его преобразования.
public class ListProcessing {
public static void main(String[] args) {
List<Integer> ints = Arrays.asList(1,2,3);
//Take a list, convert and add to new list
List<String> intStrs = listTransform(ints, new Converter<Integer, String>() {
@Override
public String convert(Integer input) {
return input==null?null:"S" input.toString();
}
});
System.out.println(intStrs);
}
//Generic list processor
protected static <T,U> List<U> listTransform(List<T> in, Converter<T,U> converter){
if(in==null) return null;
List<U> out = new ArrayList<>();
for(T item:in){
out.add(converter.convert(item));
}
return out;
}
//An interface for a converter, which converts a single item
private static abstract class Converter <T,U>{
public abstract U convert(T input);
}
}