【问题标题】:How to add items from ArrayList<Model> to ArrayList<String> in Android?如何在 Android 中将项目从 ArrayList<Model> 添加到 ArrayList<String>?
【发布时间】:2016-09-22 22:37:42
【问题描述】:

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

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

我尝试过stringArrayList.add(modelArrayList),但这给出了字符串无法应用于模型的错误。

编辑:添加类

澄清并让我更清楚地了解我正在处理的内容。 我正在使用WizarDroid Library 实现一个“向导”,而我试图合并两个不同 ArrayList 的页面基于此多选教程here

模型类:

    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&lt;String&gt; nsList = new ArrayList&lt;String&gt;();

编辑

感谢@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 声明在哪里,它们里面是什么?
  • 不能,只能将类型 String 添加到 List 并且只能将类型 Model 添加到 List
  • 显示你的Model class
  • 请看我的编辑

标签: java android string arraylist


【解决方案1】:

你需要改变这一行

stringArrayList.add(modelArrayList);

到这里:

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

这样您就可以将模型数组列表中的字符串名称添加到字符串数组列表中。

【讨论】:

  • 有了这个我可以运行我的应用程序并通过向导,但在最后一页它应该显示所有已选择项目的列表,它显示了 NSBaseModel@42042840 的列表等等当它应该显示字符串时,每个项目在 NSBaseModel@ 之后都有不同的数字
  • 是的,因为您仍在使用 NSBaseModel ArrayList 而不是您创建的字符串。更改并重试。
  • 好的。我想我误解了你。您能否澄清或详细说明您的意思?我不是一个完全的菜鸟,但我也不先进。 :)
  • 您在上面看到的课程不是我在此处添加您所说的行的地方。我改变了 stringArrayList.add(modelArrayList);根据您的建议,这就是我得到奇怪结果的地方
  • 您必须找到您的代码将数据从 ArrayList 传递到输出适配器的确切位置。我很确定你使用了错误的 ArrayList。您需要将其替换为您创建的 String ArrayList。
【解决方案2】:

首先,在上面的代码中(我没有在这里引用,因为它是完全错误的)你正在遍历数组列表,并且在每次迭代中你都将整个数组列表添加到另一个列表中。这是错误的,不会起作用。

  1. 首先确保你之前初始化了stringArrayList(你没有在上面的sn-p中显示,我希望你这样做,但只是为了确定......

  2. 使用 for 循环,因为它们应该被使用:

    ArrayList stringArrayList = new ArrayList(); for (int i = 0; i

  3. 1234563对象,而不是两个不同的Objects。如果你在其中一个中修改它,它也会在另一个中改变。实现一种正确复制它的方法。

希望有帮助!

【讨论】:

    【解决方案3】:

    为什么不循环它并自己将每个项目转换为一个新的字符串数组列表:

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

    请注意,您应该声明接口(在本例中为 java.util.List),而不是实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2014-03-23
      • 2017-09-26
      相关资源
      最近更新 更多