在 onCreateView 之前执行网络操作
Perform network operations before onCreateView
在我的应用程序片段中,我通过在 onCreate()
方法中为服务器加载数据来设置 arrayList
的值,然后我想在适配器的帮助下将该数据显示到 listView
但是当我 运行 我的程序时,它首先在 onCreate()
方法
中的网络代码之前执行 onCreateView()
onCreate()
ArrayList<ContactItem> contactsList = new ArrayList<ContactItem>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final QBUser qbUser = new QBUser("username", "password");
QBAuth.createSession(qbUser).performAsync(new QBEntityCallback<QBSession>() {
@Override
public void onSuccess(QBSession qbSession, Bundle bundle) {
Toast.makeText(getActivity(), "created", Toast.LENGTH_SHORT).show();
for (int i = 0; i < contactName.size(); i++) {
QBUsers.getUserByLogin(contactNumber.get(i).replaceAll(" ", "")).performAsync(new QBEntityCallback<QBUser>() {
@Override
public void onSuccess(QBUser qbUser, Bundle bundle) {
if (qbUser != null) {
final ContactItem contactItem = new ContactItem(qbUser.getFullName(), qbUser.getLogin(), R.drawable.profile);
contactsList.add(contactItem);
}
}
@Override
public void onError(QBResponseException e) {
}
});
}
}
@Override
public void onError(QBResponseException e) {
Toast.makeText(getActivity(), "failed " + e.toString(), Toast.LENGTH_LONG).show();
}
});
}
onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
ListView listView = (ListView) rootView.findViewById(R.id.contacts_listview);
contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
listView.setAdapter(contactItemAdapter);
return rootView;
}
在网络响应回调中添加片段或调用片段的方法。发生这种情况是因为您的片段在网络响应之前加载。
在您的代码中,先调用 onCreate(),然后再调用 onCreateView()。但是您的 API 请求在后台运行,因此在服务器响应之前您的 onCreateView() 已经被调用,因此 contactsList 中没有数据。
您可以将以下行从 onCreateView()
contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
listView.setAdapter(contactItemAdapter);
到 onSuccess(),在你将数据从服务器放入 contactsList 之后,即在外部 onSuccess() 的末尾。
在我的应用程序片段中,我通过在 onCreate()
方法中为服务器加载数据来设置 arrayList
的值,然后我想在适配器的帮助下将该数据显示到 listView
但是当我 运行 我的程序时,它首先在 onCreate()
方法
onCreateView()
onCreate()
ArrayList<ContactItem> contactsList = new ArrayList<ContactItem>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final QBUser qbUser = new QBUser("username", "password");
QBAuth.createSession(qbUser).performAsync(new QBEntityCallback<QBSession>() {
@Override
public void onSuccess(QBSession qbSession, Bundle bundle) {
Toast.makeText(getActivity(), "created", Toast.LENGTH_SHORT).show();
for (int i = 0; i < contactName.size(); i++) {
QBUsers.getUserByLogin(contactNumber.get(i).replaceAll(" ", "")).performAsync(new QBEntityCallback<QBUser>() {
@Override
public void onSuccess(QBUser qbUser, Bundle bundle) {
if (qbUser != null) {
final ContactItem contactItem = new ContactItem(qbUser.getFullName(), qbUser.getLogin(), R.drawable.profile);
contactsList.add(contactItem);
}
}
@Override
public void onError(QBResponseException e) {
}
});
}
}
@Override
public void onError(QBResponseException e) {
Toast.makeText(getActivity(), "failed " + e.toString(), Toast.LENGTH_LONG).show();
}
});
}
onCreateView()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
ListView listView = (ListView) rootView.findViewById(R.id.contacts_listview);
contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
listView.setAdapter(contactItemAdapter);
return rootView;
}
在网络响应回调中添加片段或调用片段的方法。发生这种情况是因为您的片段在网络响应之前加载。
在您的代码中,先调用 onCreate(),然后再调用 onCreateView()。但是您的 API 请求在后台运行,因此在服务器响应之前您的 onCreateView() 已经被调用,因此 contactsList 中没有数据。
您可以将以下行从 onCreateView()
contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList);
listView.setAdapter(contactItemAdapter);
到 onSuccess(),在你将数据从服务器放入 contactsList 之后,即在外部 onSuccess() 的末尾。