1

有没有办法notifyDataSetChanged()在不刷新列表或干扰 UI 的情况下调用自定义适配器?

ListView后面有一个自定义适配器,使用来宾对象列表作为其数据集。当客人通过点击他的名字来标记他的出席时,应该在用户界面中客人的名字旁边出现一个勾号。我可以这样做,但是当我调用 时notifyDataSetChanged(),名称列表一直被推到顶部,大概是因为列表“刷新”了。

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

notifyDataSetChanged() 如果不进行整个ListView刷新,怎么会打电话?

4

3 回答 3

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);
于 2013-06-25T08:15:09.090 回答
1

最好在您的访客类中有一个布尔字段:isPresent。每当用户点击列表项时,您都可以使用 adapter.getItemAtPosition() 获取所选项目。将值 isPresent 更新为 true。并显示刻度线。

在您的适配器类中。检查 isPresent 值。如果它被标记为真,则显示刻度线,否则隐藏它。

这就是您可以实现两者的方法。在 ListItem 单击时显示刻度线,如果您滚动列表视图并返回到同一个项目,适配器将处理您的刻度线显示/隐藏。

于 2013-06-25T08:22:19.427 回答
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");
                        }
                    });

                }
            }
        }
于 2013-06-25T08:26:12.613 回答