将ArrayList <string>转换为ArrayList <someclass> java </someclass> </string>

时间:2014-07-04 19:05:55

标签: java android arraylist

我设法将某个类的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吗?

4 个答案:

答案 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);
}
}