有没有办法在自定义适配器上调用notifyDataSetChanged()
而无需刷新列表或干扰用户界面?
我有一个ListView
,后面有一个自定义适配器,使用List of Guest对象作为其数据集。当访客通过点击他的名字来标记他的出席时,应该在UI中的访客姓名旁边显示一个勾号。我可以这样做,但是当我打电话给notifyDataSetChanged()
时,名字列表会一直推到顶部,大概是因为列表“刷新”。
如果我不调用notifyDataSetChanged()
,当我滚动浏览更新的条目并再次向后滚动时,勾号消失。这是由于我理解ListView的“回收”视图,但它肯定不会让我的工作变得更容易。
如果没有让notifyDataSetChanged()
整个ListView
自我刷新,如何调用{{1}} ?
答案 0 :(得分:1)
你可以保留这样的位置
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// ...
// restore
mList.setSelectionFromTop(index, top);
答案 1 :(得分:1)
最好在Guest Class中有一个布尔字段:isPresent。 每当用户点击列表项时,您都可以使用adapter.getItemAtPosition()获取所选项。 将值isPresent更新为true。并显示刻度线。
在适配器类中。检查isPresent值。如果标记为true,则显示刻度线,否则将其隐藏。
这就是你如何实现这两者。在ListItem上单击显示刻度标记,如果您滚动列表视图并返回到相同的项目,则您将使用适配器来显示/隐藏显示/隐藏。
答案 2 :(得分:0)
如果您不想在此处创建“选定项目”,则实际上可以使用代码
public void updateItem(ListView listView, Activity activity) {
if (mData == null) return;
DebugLog.i("A", "firstCell: " + listView.getFirstVisiblePosition() + " lastCell: " + listView.getLastVisiblePosition());
for (int firstCell = listView.getFirstVisiblePosition(); firstCell <= listView.getLastVisiblePosition(); firstCell++) {
final DataItem item = (DataItem) getItem(firstCell); // in this case I put the this method in the Adapter and call it from Activity where the adapter is global varialbe
View convertView = listView.getChildAt(firstCell);
if (convertView != null) {
final TextView titleTextView = (TextView) convertView.findViewById(R.id.item_title);
// here is the most important to do; you have to use Main UI thread to update the view that is why you need activity parameter in the method
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
titleTextView.setText( item + " updated");
}
});
}
}
}