【问题标题】:Android ListView Refresh Single Row - Should I hide ListView from ArrayAdapterAndroid ListView 刷新单行 - 我应该从 ArrayAdapter 隐藏 ListView
【发布时间】:2012-07-28 17:41:50
【问题描述】:

我指的是Android ListView Refresh Single Row

但是,要使用上述链接技术,我必须使 ListViewArrayAdapter 可见。

目前,为了有一个非常优化的方式来更新ListView中的显示,我需要对我的ArrayAdapter这样做

public PortfolioArrayAdapter(ListView listView, Activity activity, List<TransactionSummary> transactionSummaries) {
    super(activity, R.layout.portfolio_management_row_layout, transactionSummaries);
    this.activity = activity;
    this.listView = listView;
    ...
}

// Do not use notifyDataSetChanged, as it will refresh entire ListView.
// We only want to update certain row.
private void refreshView(final int row) {
    final int firstVisiblePosition = listView.getFirstVisiblePosition();
    final int lastVisiblePosition = listView.getLastVisiblePosition();
    if (row < firstVisiblePosition || row > lastVisiblePosition) {
        return;
    }
    this.activity.runOnUiThread(new Runnable() {
        public void run() {
            final View view = listView.getChildAt(row - firstVisiblePosition);
            // Refresh?
            getView(row, view, listView);                
        }
    });
}

但是,将ListView 引用传递给ArrayAdapter 让我感到不舒服,因为我认为它们应该相互独立? (由于 MVC?)

有没有更好的方法可以让ListView 刷新单行

在 Java Swing 中,他们以一种非常简洁的方式做到了这一点。它们为表模型提供了以下方法。

fireTableCellUpdated(row, col);

因此,该模型可以告诉视图哪一行和哪一列受到影响,而无需知道视图是谁。

在 Andorid 中,我的模型 (ArrayAdapter) 需要知道,ListView 是视图,只有这样我的模型才能与视图对话。

【问题讨论】:

  • 据我所知,您所能做的就是更新数据集并通过 notifyDatasetChanged() 通知适配器。尽管如此,如果存在性能问题(很难在列表视图中创建一个:P),您可能会持有对它的弱引用以便直接访问。

标签: android


【解决方案1】:

我不确定你为什么认为你的 ArrayAdapter 不能引用你的 ListView。 ListView 是您的 View 和 ArrayAdapter 您的模型,因此它们需要交互。来自维基百科:

当有 已经改变了它的状态。此通知允许视图 产生更新的输出,控制器改变可用的 命令集

这不正是侦听器的工作原理吗,您将视图添加到侦听对象列表中,并在任何更改时通知它们。

【讨论】:

  • MVC 的理论是,模型和视图应该相互分离。如果你在他们的桌子上做过 Java swing 编程,你就会明白我的意思。如果您查看我关于 Swing 的更新帖子,您就会知道我为什么会担心。
  • 是的,在不同的类中分开并且能够将模型用于不同的视图,反之亦然,您仍然可以使用不同的视图。但是当您在模型中引用视图时,这并没有改变。这个网站解释得很好:moock.org/lectures/mvc看mvc中的对象引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2016-01-17
相关资源
最近更新 更多