如何在Android中同时刷新两个ListView?

3

我有两个列表视图,分别为 listview_1listview_2。我想在刷新 listview_1 的同时也刷新 listview_2

我的代码如下:

public void updateTwoListView() {
    listview_1.getAdapter().notifyDataSetChanged();
    listview_2.getAdapter().notifyDataSetChanged();
}

但是它不能工作,listview_1 可以刷新,但是 listview_2 不能。在那一刻,我发现 listview_1 正在聚焦。
然后我尝试在运行该方法之前将焦点设置为其他视图,但两者都没有刷新。只有当 listview 具有焦点时,才会刷新列表视图。
更重要的是,当我调用方法进行刷新时,listview_2 没有被刷新,然后我将焦点设置到 listview_2 上,它自己刷新了!
所以,我想问的是:
如何在 Android 中同时刷新两个 listview?
更多代码:
//init two listview there
public void init() {
    listview_1 = (ListView)findViewById(R.id.listView1);
    listview_2 = (ListView)findViewById(R.id.listView2);

    adapter1 = new MyListViewAdapter(mContext);
    adapter2 = new MyListViewAdapter(mContext); //I have tried use different adapter, that also didn't work.

    listview_1.setAdapter(adapter1);
    listView_2.setAdapter(adapter2);
}

上面片段的真正代码如下:

public void updateTwoListView(int currentPosition) {
    adapter1.updateCurPos(currentPosition);
    adapter2.updateCurPos(currentPosition);
}

在MyListViewAdapter.java中:

public void updateCurPos(int currentPosition) {
    mCurrentPos = currentPosition;
    notifyDataSetChanged();
}

我将在外部调用listViewManager.updateTwoListView(1)方法来刷新。


感谢您的回复。


第二个变量也是listview_1。你是不是指的是listview_2 - Fabi755
@Fabi755 谢谢您的友好回复。^_^ - AZZ
你找到解决方案了吗?我用两个列表视图和两个ArrayAdapters进行测试,没有出现问题。你继承自哪个适配器? - Fabi755
@Fabi755 谢谢你的跟进。问题还没有解决,我也制作了一个演示来测试多个列表视图同时更新。是的,像你说的那样,它运行良好。而我猜测我的问题是由方法 updateCurPos(int currentPosition) 引起的。我只改变了 mCurrentPos 的值,但是列表视图的数据绑定并没有变化,然后使用 notifyDataSetChanged() 进行刷新,这可能会导致它无法工作。我会继续测试,直到问题解决,并在那里公布结果。谢谢。 - AZZ
1
@Fabi755 是的,它起作用了!我在updateCurPos()中更改了listview_2data绑定,然后notifyDataSetChanged()就起作用了!但是令我困惑的是,为什么listview_1使用相同的代码可以刷新,而listview_2不能。不管怎样,我很高兴我终于解决了这个问题。^_^ - AZZ
显示剩余2条评论
2个回答

1
你已经两次调用了 listview_1,只需要将其中一个更改为 listview_2,如下所示:
public void updateTwoListView() {
    listview_1.getAdapter().notifyDataSetChanged();
    listview_2.getAdapter().notifyDataSetChanged();
}

是的,事实上我这样做了。我认为这不是我无法刷新第二个列表视图的主要原因。 - AZZ
它解决了你的问题吗?如果没有,那么请发布更多的代码。 - kuldeep
如果它不起作用,我们至少需要知道你在哪里调用了这个函数。 - programmer23
@programmer23 故事有点长。我刚刚编辑了我的问题,添加了更多的代码。我可以保证我展示的方法是可行的。 - AZZ

0

你的代码问题似乎在于调用了getAdapter()

设置此ListView后面的数据。传递给此方法的适配器可能会被WrapperListAdapter包装,具体取决于当前使用的ListView功能。例如,添加标题和/或页脚将导致适配器被包装。

来源:http://developer.android.com/reference/android/widget/ListView.html#setAdapter(android.widget.ListAdapter)

解决方案是将你的Adapter保存为活动中的成员变量,并从那里调用notifyDataSetChanged()

更多信息请参见此问题的答案:https://stackoverflow.com/a/31893525/2742759


这个问题看起来和我的很相似,我希望答案也能适用于我。但是很遗憾,并不是。实际上,我已经将我的ListView和ListAdapter作为类的成员变量了。你可以看到我添加的代码。 - AZZ
哦,抱歉。是的,你说得对,我只看到了第一个代码片段。 - Fabi755

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接