如何在Android中将ArrayList<Model>中的项添加到ArrayList<String>中?

5

我已经在互联网和SO上搜寻了几个小时。我看到了许多有关如何将ArrayList中的项目添加到另一个ArrayList的示例/答案,但似乎找不到任何解释如何从一个ArrayList添加项目到另一个ArrayList的内容。

我有一个向导,可以将选择保存到两个不同的ArrayList中。第一个屏幕将所选项目保存到一个ArrayList中,另一屏幕将所选项目保存到另一个ArrayList中,然后最后一个屏幕显示从ArrayList中选择的总项目数。

我已经尝试过stringArrayList.add(modelArrayList),但是它会产生错误,指出String不能应用于model。

编辑:添加类

为了更清楚地阐明我正在处理什么,我正在使用WizarDroid库实现“向导”,而我试图在其中一个基于此多选择教程的页面here上合并两个不同的ArrayList。

模型类:

    public class NSBaseModel {
    private String baseName;

    public NSBaseModel(String name)
    {
        baseName = name;

    }

    public String getBaseName() {
        return baseName;
    }

}

向导页面:

    public class FormStepBase extends WizardStep {

    ArrayList<NSBaseModel> baseNames;
    ArrayList<NSBaseModel> selectedItems = new ArrayList<NSBaseModel>();
    NSBaseAdapter myAdapter;
    ListView myListView;

    //You must have an empty constructor for every step
    public FormStepBase() {
    }

    //Set your layout here
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        List<String> Lines = Arrays.asList(getResources().getStringArray(R.array.NAL_smoothie_base));

        baseNames = new ArrayList<NSBaseModel>();
        baseNames.add...//Long list of items here

        View v = inflater.inflate(R.layout.step_base, container, false);

        myListView = (ListView)v.findViewById(R.id.nsBaseListView);
        myAdapter = new NSBaseAdapter(v.getContext(), R.layout.row_base_layout, baseNames);
        myListView.setAdapter(myAdapter);
        myListView.setItemsCanFocus(false);


        return v;



    }

    /**
     * Called whenever the wizard proceeds to the next step or goes back to the previous step
     */

    @Override
    public void onExit(int exitCode) {
        switch (exitCode) {
            case WizardStep.EXIT_NEXT:
                //saveBaseIngredients();


                final SparseBooleanArray checkedItems = myListView.getCheckedItemPositions();
                int checkedItemsCount = checkedItems.size();
                for (int i = 0; i < checkedItemsCount; ++i) {
                    // Item position in adapter
                    int position = checkedItems.keyAt(i);
                    // Add team if item is checked == TRUE!
                    if(checkedItems.valueAt(i))
                        selectedItems.add(myAdapter.getItem(position));
                    for (int i = 0; i < selectedItems.size(); i++) {
                        selectedItems.get(i);
                        System.out.print("option list size");
                        System.out.print(selectedItems.size());

                        //reference to static ArrayList<String> here
                        CreateList.nsList.add(selectedItems);

                    }
                }
                if(selectedItems.size() < 2)
                    Toast.makeText(getContext(), "Need to select two or more items.", Toast.LENGTH_SHORT).show();
                else
                {
                    // Just logging the output.
                    for(NSBaseModel t : selectedItems)
                        Log.d("SELECTED TEAMS: ", t.getBaseName());
                        //Thought I could get the strings from here since they show in the logcat

                }

                break;
            case WizardStep.EXIT_PREVIOUS:
                //Do nothing...
                break;
        }
    }


}

在我的CreateList类中,我有一个public static ArrayList<String> nsList = new ArrayList<String>();
编辑:
感谢@Polichronis Charitidis,他的答案最终解决了我的问题。它没有为我工作的原因是因为我在我的两个for循环中都声明了int i,从而混淆了系统和结果。我不得不将我的第二个for循环中的int i变量更改为另一个字母,现在它可以正常工作了。这是我现在的第二个“for”循环的样子。
for (int j = 0; j < selectedItems.size(); j++) {
                    selectedItems.get(i);
                    System.out.print("option list size");
                    System.out.print(selectedItems.size());
                    CreateList.nsList.add(selectedItems.get(j).getBaseName());

                }

stringArrayListmodelArrayList的声明在哪里?它们里面装了什么? - Shree Krishna
你不能将除了String类型以外的其他类型添加到List<String>中,也不能将除了Model类型以外的其他类型添加到List<Model>中。 - Nongthonbam Tonthoi
展示你的“模型类”。 - Sohail Zahid
请看我的编辑。 - Steve C.
3个回答

2

你需要更改这一行

stringArrayList.add(modelArrayList);

转换为:

stringArrayList.add(modelArrayList.get(i).getBaseName());

您可以将Model ArrayList中的String名称添加到String ArrayList中。


是的,因为您仍在使用NSBaseModel ArrayList而不是您创建的String ArrayList。更改它并重试。 - xro7
你在上面看到的类并不是我添加了你在这里提到的那行代码的地方。我将stringArrayList.add(modelArrayList);更改为你建议的内容,这就是我得到奇怪结果的地方。 - Steve C.
你需要找到代码在哪里将数据从ArrayList传递给输出适配器。我相信你使用了错误的ArrayList。你需要用你创建的String ArrayList替换它。 - xro7
请查看我的最后一次编辑。感谢您的回答。我之前得到奇怪的结果是因为两个for循环中都有“int i”。现在它完美地工作了。再次感谢! - Steve C.
@xro7,您能否看一下这个类似的问题:https://stackoverflow.com/questions/68050680/how-to-display-data-from-one-activitys-recyclerview-to-another-activitys-recyc - Kumza Ion
显示剩余3条评论

0
首先,在上面的代码中(我不引用它,因为它是错误的),您正在遍历数组列表,并在每次迭代时将整个数组列表添加到另一个数组列表中。这是错误的,不会起作用。
  1. 首先确保在此之前初始化stringArrayList(您没有在上面的片段中显示它,我希望您这样做,但只是为了确保一下...)
  2. 按照正确的方式使用for循环:

    ArrayList stringArrayList = new ArrayList<>(); for (int i = 0; i < modelArrayList.size(); i++) { stringArrayList.add(modelArrayList.get(i); }

  3. String是一个Object而不是原始类型,因此您正在向ArrayList添加引用,即使从一个ArrayList添加到另一个ArrayList,它仍然是同一个对象,而不是两个不同的Objects。如果您在其中一个中进行修改,它也会在另一个中更改。实现适当的复制方式。
希望这有所帮助!

0

为什么不循环遍历它并将每个项转换为自己的新字符串ArrayList:

List<String> strings = new ArrayList<>();
for (Object yourmodelArralistObject: list) {
strings.add(yourmodelArralistObject!= null ? 
yourmodelArralistObject.toString() : null); 
}

请注意,您应该针对接口(在此情况下为java.util.List)进行声明,而不是实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接