notifyDataSetChanged()没有刷新UI?

时间:2013-06-25 08:09:35

标签: android listview notifydatasetchanged

有没有办法在自定义适配器上调用notifyDataSetChanged()而无需刷新列表或干扰用户界面?

我有一个ListView,后面有一个自定义适配器,使用List of Guest对象作为其数据集。当访客通过点击他的名字来标记他的出席时,应该在UI中的访客姓名旁边显示一个勾号。我可以这样做,但是当我打电话给notifyDataSetChanged()时,名字列表会一直推到顶部,大概是因为列表“刷新”。

如果我调用notifyDataSetChanged(),当我滚动浏览更新的条目并再次向后滚动时,勾号消失。这是由于我理解ListView的“回收”视图,但它肯定不会让我的工作变得更容易。

如果没有让notifyDataSetChanged()整个ListView自我刷新,如何调用{{1}}

3 个答案:

答案 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");
                        }
                    });

                }
            }
        }