好的,所以我花了两天时间在这上面,我尝试了一切在阳光下和谷歌:L
基本上,如果我在服务器中添加或删除某些内容,我想从我的detailfragment更新我的listview,它位于mylistfragment中,以反映服务器上的更改。通过单击详细信息片段中的删除或添加按钮,可以进行更改。
我有一个回调方法,它包含了重新填充listview所需的一切,我似乎无法让listview更新。
非常感谢任何帮助。
我的回调代码如下:
public final Handler myCallBackAll = new Handler() {
@Override
public void handleMessage(Message msg) {
ListView lv = (ListView) view.findViewById(R.id.listView1);
if (msg.obj == "No Response") {
TextView tv2 = (TextView) view.findViewById(R.id.textView2);
tv2.setText("No Response. Please check your internet connection");
tv2.setVisibility(View.VISIBLE);
lv.setVisibility(View.INVISIBLE);
} else {
Beer beers = new Beer();
ArrayAdapter<Beer> arrayAdapter = new ArrayAdapter<Beer>(
getActivity(), android.R.layout.simple_list_item_1,(List)msg.obj);
lv.setAdapter(arrayAdapterNew);
arrayAdapter.notifyDataSetChanged();
}
}
};
它不会抛出任何错误,只是不起作用
我的回调是如何调用的
if (isBound) {
myBinder.getAllBeer(myCallBackAll);
}
这是我必须使用的有限服务,是项目的规定。所有这些代码都有效,只是mylistview不会更新
答案 0 :(得分:1)
你说你已经设置了回调,所以我假设回调是相应的。如果是这种情况,请确保更新您在适配器中使用的数据源(数组,列表等),以反映您在detailfragment中所做的更改。
另外,请不要忘记每次添加,编辑,删除适配器数据源中的数据时,都必须调用mAdapter.notifyDataSetChanged()
告诉适配器数据中的某些内容发生了变化。< / p>
修改强>
尝试以这种方式创建处理程序:public final Handler myCallBackAll = new Handler(Looper.getMainLooper())
notifyDataSetChanged()必须在主UI线程上执行。当您创建一个新的处理程序时,它将在自己的线程上执行,因此您需要确保它在UI线程上执行。请查看here了解更多信息
答案 1 :(得分:0)
终于想通了,可能不是最好的方法,但确实有效,我在我的主要活动中将我的列表视图声明为静态变量,然后在两个片段中引用这个变量并且它起作用:P