【发布时间】:2012-07-28 17:41:50
【问题描述】:
我指的是Android ListView Refresh Single Row
但是,要使用上述链接技术,我必须使 ListView 对 ArrayAdapter 可见。
目前,为了有一个非常优化的方式来更新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