我设法将某个类的arraylist(在我的情况下,它是一个扩展ArrayAdapter<Question>
的类)转换为ArrayList<String>
。我已通过android intent bundle传递它,并通过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;
}
我添加了一个try / catch我的适配器,我收到错误:
java.lang.String无法强制转换为java.com.example.Question。
我做错了什么?是因为我还没有首先转换回正确的ArrayList吗?
答案 0 :(得分:3)
在您的第一个示例中,您实际上并未将Question
投射到String
。您正在为toString()
调用Question
方法。
例如,
public class Question {
//instance member
String question;
public String toString() {
return question;
}
}
为了从String
转到Question
,您将不得不编写一个构造函数或方法,将String
作为参数并返回{{ 1}}。
例如,您可以将此构造函数添加到Question
类:
Question
答案 1 :(得分:1)
好的。要从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
对象的方法,为什么不将它作为一个构造函数,将String作为参数?
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...
}
}
答案 2 :(得分:0)
toString()
是所有Java Object
对象都具有的方法。默认情况下,它将列出类的名称和引用的内存位置。您实际上并未将对象Question
转换为String
。您正在生成一个String
,其中某些内容解释Question
是什么。例如,您可以覆盖toString()
以生成您想要的任何内容。
public class Question {
String mQuestion;
@Override
public String toString() {
return mQuestion;
}
}
现在,您可以做的是在toString()
中创建一些完全代表您的Question
对象的自定义字符串。然后使用fromString
方法解析自定义String并从中构建新的Question
对象。但是,这种方法容易出错并且有限制。
更好的方法是从Question
或更好Parcelable继承Serializable
。这样做允许您将实际的Question
对象放入Bundle中,并从Intent中将其拉出而不进行任何转换。
答案 3 :(得分:0)
您必须正确理解类型转换。
类型转换不是转换。它要求java为该上下文的其余部分假设该对象的真实类型就是您所说的。你告诉java,尽管在当前的上下文中它并不明显,但你更了解对象的实际类型是什么。
在每个上下文中都没有关于对象确切类型的信息。当您传递对象时,方法会将它们视为对象的任何超类类型。
类型转换是一种告诉java“我已经知道它是List&lt;问题&gt;因为我知道谁将那个对象放在那里”的方法。
因此,类型转换无法帮助转换。该对象应该已经属于类型转换的类型。
如果是不同的类型,则必须编写代码进行转换。
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);
}
}