【问题标题】:Android : loop through all items in a listviewAndroid:遍历列表视图中的所有项目
【发布时间】:2015-05-05 04:58:28
【问题描述】:

想要快速回答如何在我的列表视图中列出所有项目,以便打印出列表或共享到记事本应用程序等。也就是说,从列表视图中获取具有以下信息的变量:“apple”, “香蕉”、“橙子”。下面是我的列表视图。谢谢

    String[] values = new String[] { "apple", "banana", "orange" };

    listItems = new ArrayList<String>();
    for (int i = 0; i < values.length; ++i) {
        listItems.add(values[i]);
    }

    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1,
            listItems);

    // Assign adapter to ListView
    listView.setAdapter(adapter);

【问题讨论】:

  • 您的数组值只有一项”?这是一个“-”还是您在帖子中排除了一些代码行。
  • 还没有学会这样做,也没有在listview上找到任何只做这个简单事情的文章!
  • @user2911996 share to a notepad app 是什么意思?
  • 为什么首先需要这个?这没有任何意义,并且您已经可以访问 listItems,它包含您的列表视图中的所有内容,因为您作为参数传递给适配器
  • 我想我以后可能会一次向列表视图添加/删除项目。但是我拥有的 listItems 是否始终与我在 listview 中拥有的相同?

标签: android loops listview items


【解决方案1】:

你的问题是,

遍历列表视图中的所有项目。

我从您的代码中了解到您希望将项目从 String array 添加到 ArrayList

但是,您可以将字符串数组作为第三个参数直接传递给您的ArrayAdapter

查看 Android Studio 为ArrayAdapter 提供的建议。你也可以通过String[]ArrayList :

您可以将 String[] 传递给 ArrayList,或者如果您想将所有 String[] 项循环到 ArrayList,则只需一行即可。

    Collections.addAll(arrayList,values);

arrayList - ArrayList

价值观 - String[]

而不是,

    listItems = new ArrayList<String>();
    for (int i = 0; i < values.length; ++i) {
        listItems.add(values[i]);
    }

你在评论区说

我想我以后可以一次向listView 添加/删除项目。

在这种情况下,您可以使用一些按钮来重新加载列表以显示旧项目 + 添加的新项目或显示列表,但已删除的项目除外。我将在下面添加您必须如何实现它。

在你的布局中有一个按钮AddMore,每当你想添加新项目时,就这样做

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                arrayList.add("lemon"); // this adds item lemon to arraylist
                arrayList.add("Pomgranete");
                arrayAdapter.notifyDataSetChanged(); // this will refresh the listview and shows the newly added items too
            }
        });

同样可以通过在arrayList中传递item的位置来删除item,

      arrayList.remove(arrayList.get(i)); // i is the position & note arrayList starts from 0

所以,总结一下,这里是完整的工作代码:

public class MainActivity extends AppCompatActivity {

    ListView listView;
    String[] values = {"Apple", "Orange", "Banana"};
    List<String> arrayList;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView)findViewById(R.id.listView);
        button = (Button)findViewById(R.id.button);
        arrayList = new ArrayList<String>();

        Collections.addAll(arrayList,values); // here you're copying all items from String[] to ArrayList

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayList);
        listView.setAdapter(arrayAdapter);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                arrayList.remove(arrayList.get(2)); // here i remove banana since it's position is two. My ordering of items is different so it removed banana. If i use ordering from your quest, it will remove orange.
                arrayList.add("lemon"); // adding lemon to list
                arrayList.add("Pomgranete"); // adding pomgranete
                arrayAdapter.notifyDataSetChanged(); // this used to refresh the listView
            }
        });

     }
    }

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"  tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ADD MORE"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/button" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/button" />


</RelativeLayout>

输出:

包含预定义的 3 个项目和一键加载更多项目的列表。

旧的 3 项列表 + 新添加的 2 项 (这里我没有使用 arrayList.remove

除已删除项外的旧项列表 + 新添加的 2 项(这里我使用 arrayList.remove 删除了 arrayList.remove(arrayList.get(2)); 的香蕉)

【讨论】:

  • 是的,这就是我想要的。在您的示例中,arrayList 是我想要的,我可以获取其中的字符串并将其放入变量中,然后使用意图将其共享给其他应用程序。只是我以前使用过其他编程语言,所以没有找到任何做同样事情的例子。这个例子很好,但如果列表视图上有重复的项目,它似乎不起作用。试着再举一个同样适用于重复项目的例子吗?谢谢
  • @user2911996 您的问题完全集中在如何遍历 listView 中的所有项目。我继续前进,甚至提供了带有解释的工作代码示例。现在,如果您想要防止重复项目等其他事情,那么您需要开始新帖子或查看此帖子stackoverflow.com/questions/14192532/…
  • 我的列表可能包含重复的项目,例如记录这次购买了多少苹果,并且不想确保唯一值。但是您的回答已经满足了我的需求。谢谢
【解决方案2】:

据我了解,您想创建一个 ArrayAdapter,稍后向其中添加一些项目,并在某个时候从中检索所有项目,对吧?

由于您使用 ArrayAdapter,您可以迭代其内容:

    String[] items = new String[adapter.getCount()];
    for(int i = 0; i < adapter.getCount(); i++){
        items[i] = adapter.getItem(i);
        Log.d("TAG", "Item nr: " +i + " "+ adapter.getItem(i));
    }

ArrayAdapter documentation

【讨论】:

    【解决方案3】:

    由于您的代码中已经有一个数组和一个数组列表,所以应该很容易。

    但是如果你想稍后循环并且你只有你的列表视图,我相信你的列表视图中有一个适配器的吸气剂,如果你将给定的适配器转换为 ArrayAdapter,那么它应该有一个吸气剂到项目你正在寻找。

    ArrayAdapter<String> adapter = (ArrayAdapter<String>)mListView.getAdapter();
    for(int i=0; i<adapter.getCount();i++){
        String item = adapter.getItem(i);
        /*...*/
    }
    

    【讨论】:

      【解决方案4】:

      您不需要循环或任何操作,只需将数组直接传递给适配器即可。

      adapter = new ArrayAdapter<String>(this,
              android.R.layout.simple_list_item_1, android.R.id.text1,
              values);
      

      新的 ArrayAdapter 将array 作为第三个参数。

      【讨论】:

      • 对不起,我想念你的问题我想你只想在 ListView 中显示项目。但我现在知道您希望它能够添加和删除项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多