为什么 ArrayAdapter 在此示例中始终为 null?
Why is ArrayAdapter always null in this example?
我的代码结构如下:
public class MyListFragment extends ListFragment {
private ArrayList<User> users;
private void initAdapter() {
if(users == null) return;
//getUserStatus(users); <———HERE 1
UsersAdapter adapter = new UsersAdapter(users);
setListAdapter(users);
getUserStatus(users); // vs <—— HERE 2
}
private void getUserStatus(List<User> users) {
final UsersAdapter adapter = (UsersAdapter )getListAdapter();
for(User user:users) {
Thread t = new Thread(new Runnable() {
//code to fetch some data
if ( adapter == null) Log.e(“App”, “Adapter is NULL!”);
});
t.start();
}
}
private UsersAdapter extends ArrayAdapter<User> {
public UsersAdapter(List<User> users) {
super(getActivity(), 0, users);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//code to inflate and populate list item
}
}
我的问题是:
为什么如果在我的 initAdapter
中,如果我在标记为 HERE 2
的当前版本中注释掉 getUserStatus
并取消注释 HERE 1
,那么 getUserStatus
就是 运行 在 setListAdapter
之前 adapter
在 getUserStatus
中总是 null
?我总是在所有线程的日志中看到 Adapter is NULL
?
很简单。在 HERE 1 中,您试图从尚未初始化的适配器中获取与用户相关的内容,该适配器正在使用函数 setListAdapters(users) 进行初始化。在 HERE 2 中,您在初始化适配器后获得用户,因此它工作正常。
我的代码结构如下:
public class MyListFragment extends ListFragment {
private ArrayList<User> users;
private void initAdapter() {
if(users == null) return;
//getUserStatus(users); <———HERE 1
UsersAdapter adapter = new UsersAdapter(users);
setListAdapter(users);
getUserStatus(users); // vs <—— HERE 2
}
private void getUserStatus(List<User> users) {
final UsersAdapter adapter = (UsersAdapter )getListAdapter();
for(User user:users) {
Thread t = new Thread(new Runnable() {
//code to fetch some data
if ( adapter == null) Log.e(“App”, “Adapter is NULL!”);
});
t.start();
}
}
private UsersAdapter extends ArrayAdapter<User> {
public UsersAdapter(List<User> users) {
super(getActivity(), 0, users);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//code to inflate and populate list item
}
}
我的问题是:
为什么如果在我的 initAdapter
中,如果我在标记为 HERE 2
的当前版本中注释掉 getUserStatus
并取消注释 HERE 1
,那么 getUserStatus
就是 运行 在 setListAdapter
之前 adapter
在 getUserStatus
中总是 null
?我总是在所有线程的日志中看到 Adapter is NULL
?
很简单。在 HERE 1 中,您试图从尚未初始化的适配器中获取与用户相关的内容,该适配器正在使用函数 setListAdapters(users) 进行初始化。在 HERE 2 中,您在初始化适配器后获得用户,因此它工作正常。