我已经阅读了很多关于如何更新 ListView 的问题。他们几乎都说 adapter.notifyDataSetChanged() (如果在带有 runOnUiThread 的单独线程中)。
我的问题开始得有点早:我什至如何获得我需要的适配器或与此相关的 Activity 来调用 runOnUiThread?
这是我当前代码的一个非常简化的版本:
我有一个数据类,可以随时随地更新。更新方法需要启动一个新线程,这就是为什么我不能简单地等待返回值。
class Data {
private static double[] data = new double[7]
public static void update(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
//do lots of complicated stuff
}
}).start();
}
public double[] getData {
return data;
}
我有一个 Activity(不是主 Activity),其中包含 ListView
public class ListViewActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ListView);
ListView listView = (ListView) findViewById(R.id.MyListView);
listView.setAdapter(new CustomListViewAdapter(this));
}
然后我使用自定义适配器按照我的需要设置 ListView。
class CustomListViewAdapter extends BaseAdapter {
private final LayoutInflater layoutInflater;
public CustomListViewAdapter(Context context) {
layoutInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
if (view == null) {
view = layoutInflater.inflate(R.layout.listView_row_layout, parent, false);
viewHolder.value = (TextView) view.findViewById(R.id.listViewDataTextField);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
double data = Data.getData()[position];
viewHolder.value.setText(data+"");
return view;
}
private class ViewHolder {
TextView value;
}
现在我想在 update() 方法中的线程完成获取新数据后立即更新 ListView。获取数据可能需要几秒钟,因此无法预测届时哪些 Activity 将处于 Activity 状态。如果我的 ListViewActivity 处于 Activity 状态,我希望 ListView 立即更改为新数据。
那么如何在另一个线程中从另一个不是 Activity 的类更新 ListView?我不认为将适配器放在静态字段中是个好主意,因为 ListViewActivity 可能一直在创建和销毁?但是我还有哪些其他选择?
最佳答案
定义一个回调接口(interface)。让您的更新方法将此回调的实例作为参数,并在更新完成时回调它。
public interface UpdateCallback {
public void onUpdateFinished();
}
public void update(final Context context, final UpdateCallback callback) {
new Thread(new Runnable() {
@Override
public void run() {
// do lots of complicated stuff
callback.onUpdateFinished();
}
}).start();
}
然后在您的 Activity 中您可以通知适配器数据已更改:
Data.update(this, new UpdateCallback() {
public void onUpdateFinished() {
adapter.notifyDatasetChanged();
}
});
关于multithreading - 如何从完全不相关的类更新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23879314/