【问题标题】:How to update the `ListView` according to `ArrayList`?如何根据`ArrayList`更新`ListView`?
【发布时间】:2016-01-30 06:25:55
【问题描述】:

我有一系列联系人,我会不断更新。我希望我的ListView 与我的联系人一起更新。

我应该为此使用Adapter 吗?我在网上找不到很多关于Adapter 的信息,那么如何确保我的列表视图始终包含我的Array 的内容? (我已经研究了 4 个半小时!)

例如,如果我有一个包含内容"apple""orange" 的数组,那么我的列表也应该显示"apple""orange"

如果我选择删除"apple",那么我的列表应该只显示"orange"。基本上,我的列表应该始终与我的数组相同。

我看到了this,但是我将如何删除和添加更多项目到我的列表中?

【问题讨论】:

  • 参考我的从联系人列表中获取联系人的解决方案...stackoverflow.com/a/35077124/3946958
  • @RavindraKushwaha 谢谢,但这不是我想要做的。我的数组列表中有特定的联系人,用户已经使用意图选择了这些联系人。我只想将 my arraylist 中的联系人保留到列表视图中。怎么办?

标签: java android arrays listview


【解决方案1】:

创建一个类似这样的 ListAdapter。

public class MyListAdapter extends BaseAdapter {


  private ArrayList<String> names = new ArrayList();

  @Override
  public int getCount() {
    return names.length;
  }

  @Override
  public Object getItem(int location) {
    return names[location];
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  private static class ViewHolder {
    public TextView listViewNgoName, listViewDistance, listViewRating, listViewAbout, ngoIcon;
  }

  public MyListAdapter(
      ArrayList names) {
    this.names = names;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
     // Write code for instantiating a row based view.
    return convertView;
  }
}

现在在你的活动中

    ArrayList<String> names = new ArrayList();
    names.add("oranges");
    names.add("apple");
    ListView listView = (ListView) findViewById(R.id.listview);
    MyListAdapter adapter = new MyListAdapter(names);
    listView.setAdapter(adapter);

假设您需要在单击按钮时更新列表视图。 IE。在按钮上单击数组中的值会发生变化,并且您想更新 listView。

Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        names.add("payaya");
        names.add("grapes");
        adapter.notifyDataSetChanged();
      }
    });

我还没有写完整的代码。只是一个良好的开端。

【讨论】:

    【解决方案2】:

    所以,您必须通知您的 ListView 适配器数据已更改。

    listViewAdapater.notifyDataSetChanged();
    

    希望,这会工作

    【讨论】:

    • 如何制作适配器?
    【解决方案3】:

    使用ArrayList而不是Array[],你不需要为ArrayList初始化大小,所以它比Array[]更灵活。如果你在adddelete 里面有物品,它会自动放大或缩小

    【讨论】:

      【解决方案4】:

      我建议使用 ArrayList,而不是 Array

      ArrayList 优于 Array 的优点是数组需要固定大小。所以如果你正在初始化一个数组

      String names[] = new String[10];
      

      大小为10,设置为ListView时,ListView会显示10个列表,虽然只有8个数组位置有名字

      如果你使用 ArrayList,你不必担心大小,因为它可以放大和缩小

      List<String> names = new ArrayList<>();
      names.add("Raul");
      names.add("Khan");
      names.remove(1);
      

      add() 将一个项目添加到列表中,而 remove() 删除一个项目。

      关于你的回答,假设你有一个 ArrayList 的项目

      当您有一个新项目要添加到列表中时,只需使用 add() 方法将其添加到您的 ArrayList 中,最后在您的 ArrayAdapter 上调用 notifyDataSetChanged()

      是的,你必须使用这样的 ArrayAdapter

      ArrayList<String> namesList = new ArrayList<>();
      ArrayAdapter arrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, namesList);
      

      当您对列表进行更改时,即当您将项目添加到列表时,请在 arrayAdapter 上调用 notifyDataSetChanged()。


      【讨论】:

      • 谢谢,simple_list_item_1 是什么?
      • 这是微调器布局的android默认值
      • 等等,什么微调器布局?现在我真的很困惑,我以为我改变的只是我的列表视图?
      • 对不起,我看错了,我的意思是ListView布局。 Spinner 也有类似的东西。
      • 所以为了清楚起见,我不修改实际的适配器,我只修改arraylist。然后,我调用notifydatasetchanged修改适配器对应的布局?
      【解决方案5】:

      我的Adapter 中通常有一个名为setData(List&lt;whatever&gt; data) 的方法。我的AdapterActivity。当在我的活动中,我从任何地方获取更新的数组时,我使用包含更新数组的新数组调用 setData()

      在我的适配器中,我定义了一个字段,如:private List&lt;Whatever&gt; mItems。我在AdaptergetCount()方法中使用这个字段来获取列表项,基本上我使用这个列表来填充ListView

      我在setdata() 中所做的是将data 分配给mItems,然后我调用notifyDataSetchanged() 来刷新ListView,这一次它将使用新设置的数据值,所以一切都会更新到适当的状态。

      更新

      我没有快速访问ListView 的适配器,但下面的应该可以,它是ViewPager,但原理是一样的:

      public class AdapterTweets extends PagerAdapter {
          private List<Tweet> mItems;
      
          // [...]
      
          @Override
          public int getCount() {
              return mItems == null ? 0 : mItems.size();
          }
      
          // [...]
      
          public void setData(List<Tweet> items) {
              mItems = items;
              notifyDataSetChanged();
          }
      }
      

      【讨论】:

      • 哦,有道理。你能提供一个例子吗,我仍然对适配器部分感到困惑。谢谢!
      • 我已经更新了帖子,请查看...一旦您有了要显示的新项目列表,您就可以致电setData,它会刷新列表。 :)
      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多