我的代码结构如下:
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
中,如果我在标记为getUserStatus
的当前版本中注释掉HERE 2
并取消注释HERE 1
,那么getUserStatus
在之前运行 / em> setListAdapter
adapter
始终null
getUserStatus
?我总是在日志中看到所有线程Adapter is NULL
?
答案 0 :(得分:0)
很简单。在这里,你试图从你尚未初始化的适配器获取用户相关的东西,这是使用函数setListAdapters(用户)进行的。在HERE 2中,您在初始化适配器后获得用户,因此它工作正常。