【问题标题】:Replace List of ArrayAdapter替换 ArrayAdapter 列表
【发布时间】:2014-09-23 01:49:07
【问题描述】:

我有一个自定义 ArrayAdapter,它为我的 ListView 使用 ArrayList<OrderedProductItem>。在这个 ListView 中,我有一个 AutoCompleteTextView,它还使用了一个带有 ArrayList<Product> 的自定义 ArrayAdapter。在初始化时,此 AutoCompleteTextView 包含所有产品的名称(大约 1250),减去 1(OrderedProductItem 的产品)。

然后用户可以使用 Spinner 来选择产品标签,然后我创建一个过滤的ArrayList<Product>,因此我只得到包含此产品标签的所有产品的列表(仍然减去 1)。所以,我的问题是:替换 ArrayAdapter 的对象列表的最佳方法是什么?

我知道我可以在我的 ListActivity 中重新创建和重新分配一个新的 ArrayAdapter 实例:

myAdapter = new MyAdapter(this, R.layout.item_view, myList);
setListAdapter(myAdapter);

我也知道我可以使用 clear 然后 addAll 来替换所有内容:

// NOTE: myAdapter.setNotifyOnChange is kept on default (true)
myAdapter.clear();
myAdapter.addAll(myList);

我想第二个可能是最好的,因为我们不想每次都创建一个新的实例,或者 ArrayAdapter 有没有像setArray() 这样的方法而我在寻找它时错过了它?或者还有比第二个选项更好的性能方法吗?

【问题讨论】:

  • 你为什么害怕表演?
  • @blackbelt 嗯,首先是移动设备,所以性能应该始终是一个问题。此外,我的每个 ListView 项目都包含大约 10 个 View 元素(Spinner、ImageView、AutoCompleteTextView 等)。总而言之,我已经设法通过使用排序列表和重用实例来提高性能,并且正确现在我想保持这种方式。另外,我主要提出了这个问题,因为我找不到setArray(),第二部分是一个for循环,将它们一一添加,但是在提出问题时我发现addAll()(它仍然使用后面的循环我能想象的场景。)
  • 如果您遇到性能问题,性能是一个问题。回到主要问题,较重的操作是getView,它必须膨胀/测量/布局/绘制 ListView 的子项,并且在这两种情况下,您都在调度 it。在我看来它确实有任何区别
  • 实际上,它确实有所作为。创建和设置新适配器将清除并重置列表和回收器 - 可能已被重用的视图被释放并且必须重新创建

标签: java android arraylist android-arrayadapter notifydatasetchanged


【解决方案1】:

在这里你想改变customAdapter的数据在适配器中创建一个公共方法

public void updateData(ArrayList<T> list){
 mAdapterProductList=list;
}

现在每当您想更新数据时,请使用以下代码:

adpter.updateData(mUpdatedList);
adapter.notifyDataSetChanges();

无需重新实例化您的适配器

【讨论】:

  • 您也可以在适配器 updateData(ArrayList list) 方法中调用 notifyDataSetChanges()。
  • 这对我有用,但我还必须重写 getCount() 方法以返回列表的大小。
  • mAdapterProductList = list; 和 mAdapterProductList.clear(); + mAdapterProductList.addAll(list); 一样吗?
  • @rohan-taneja。是的,它的工作原理是一样的。只需在下一行添加 notifyDataSetChanges()
  • @PradeepYaduvansy 你能看看这个吗? :stackoverflow.com/questions/56454443/…
【解决方案2】:

创建回调接口并使用

public MyAdapter extends ... {

    public interface GetActualListCallback {
        List<OrderedProductItem> getList();
    }

    private GetActualListCallback mCallback;

    public MyAdapter(Context context, int resId, GetActualListCallback callback) {
        super(context, resId)
        mCallback = callback;
    }

    public int getCount() {
        return mCallback.getList().size();
    }

        ....

}

在你的活动中实现这个接口。

myAdapter = new MyAdapter(this, R.layout.item_view, this);
setListAdapter(myAdapter);

更新列表后只需在 myAdapter 上调用 notifyDataSetChanged()

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 2012-01-31
    • 2011-09-21
    • 2019-06-09
    • 2021-07-16
    • 2011-12-07
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多