【发布时间】:2015-08-18 00:50:23
【问题描述】:
我有两个模型是 Message 和 User。我使用 asyncTaskAdapters 接收消息列表和用户列表的 Fragment,我希望在 listview 项目上显示这些列表中的数据。
它应该显示一些消息和用户名
public class DialogsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
public static final String USER = "user";
private static final String LOG_TAG = DialogsFragment.class.getSimpleName();
private static final int LOADER_MESSAGES_ID = 1;
private static final int LOADER_USERS_ID = 2;
long dialogsRequest = -1;
long usersRequest = -1;
private List<Message> messageList = new ArrayList<>();
private List<User> userList = new ArrayList<>();
private List<Long> usersIdList = new ArrayList<>();
private ListMessagesAdapter mAdapter;
private LoaderManager loaderManager;
@InjectView(R.id.swipe_refresh)
SwipeRefreshLayout refreshLayout;
@InjectView(R.id.footer_conversation)
RelativeLayout mFooter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.activity_dialog_view, container, false);
ButterKnife.inject(this, layout);
refreshLayout.setOnRefreshListener(this);
loadDialogs();
return layout;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new ListMessagesAdapter(messageList, userList, getActivity());
SpeedyQuickReturnListViewOnScrollListener scrollListener =
new SpeedyQuickReturnListViewOnScrollListener
.Builder(getActivity()
, QuickReturnViewType.GOOGLE_PLUS).build();
setListAdapter(mAdapter);
scrollListener.registerExtraOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
}
@Override
public void onScroll(AbsListView absListView, int first, int visibleCount, int total) {
boolean loadMore = /* maybe add a padding*/
first + visibleCount >= total - 1;
if (loadMore && total > 0) {
dialogsRequest = getServiceHelper().getDialogs(total - 1, 25);
}
}
});
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Message message = getOnClickMessage(position);
Log.i(LOG_TAG, "user id from msg " + message.getUserId());
User user = User.UTIL.getUser(message.getUserId(), userList);
Log.i(LOG_TAG, "user id " + user.getId());
Intent intentChatActivity = new Intent(getActivity(), HistoryActivity.class);
intentChatActivity.putExtra(USER, user);
startActivity(intentChatActivity);
}
});
getListView().setOnScrollListener(scrollListener);
}
@Override
public void onRefresh() {
Log.i(LOG_TAG, " refresh start");
dialogsRequest = getServiceHelper().getDialogs(0, 25);
refreshLayout.setRefreshing(true);
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onServiceCallback(long requestId, Intent requestIntent, int resultCode, Bundle data) {
super.onServiceCallback(requestId, requestIntent, resultCode, data);
if (requestId == dialogsRequest) {
Log.i(LOG_TAG, "message request complete " + requestId);
loaderManager.getLoader(LOADER_MESSAGES_ID).forceLoad();
} else if (requestId == usersRequest) {
Log.i(LOG_TAG, "user request complete " + requestId);
loaderManager.getLoader(LOADER_USERS_ID).forceLoad();
}
}
private LoaderCallbacks<Dialogs> messagesCallbacks = new LoaderCallbacks<Dialogs>() {
@Override
public Loader<Dialogs> onCreateLoader(int id, Bundle args) {
DialogsAsyncLoader messagesLoader = new DialogsAsyncLoader(getActivity());
return messagesLoader;
}
@Override
public void onLoadFinished(Loader<Dialogs> loader, Dialogs data) {
messageList = data.getDialogs();
Log.i(LOG_TAG, "message size from request " + messageList.size());
if (messageList.size() > 0) {
String userIds = User.UTIL.getIds(messageList);
usersRequest = getServiceHelper().getUsers(userIds);
Log.i(LOG_TAG, "start userRequest " + usersRequest);
}
mAdapter.setMessages(messageList);
}
@Override
public void onLoaderReset(Loader<Dialogs> loader) {
}
};
private LoaderCallbacks<List<User>> usersCallback = new LoaderCallbacks<List<User>>() {
@Override
public Loader<List<User>> onCreateLoader(int id, Bundle args) {
UsersAsyncLoader usersLoader = new UsersAsyncLoader(getActivity());
return usersLoader;
}
@Override
public void onLoadFinished(Loader<List<User>> loader, List<User> data) {
userList = data;
mAdapter.setUsers(userList);
refreshLayout.setRefreshing(false);
}
@Override
public void onLoaderReset(Loader<List<User>> loader) {
mAdapter.setUsers(new ArrayList<User>());
}
};
private Message getOnClickMessage(int positon) {
return messageList.get(positon);
}
private void loadDialogs() {
if (loaderManager == null) {
loaderManager = getLoaderManager();
}
loaderManager.initLoader(LOADER_MESSAGES_ID, null, messagesCallbacks);
loaderManager.initLoader(LOADER_USERS_ID, null, usersCallback);
dialogsRequest = getServiceHelper().getDialogs(0, 25);
}
我有一些使用 ArrayAdapter 的想法
mAdapter = new ListMessagesAdapter(messageList, userList, getActivity());
但是,当片段启动时,它会显示没有用户名的消息,需要等待 5-10 秒才能显示 users 。如何同步显示这些列表?
重要时刻:
每条消息都有 user_id,所以当我从 db 获得消息列表时 dialogsAsyncLoader 我构建了包含 user_ids 的行,然后我使用 这行 id 用于执行获取用户列表的请求
【问题讨论】:
-
您可能希望将代码示例减少到重现问题的最小片段——我怀疑很多人会愿意阅读您那里的代码墙。
标签: android listview android-fragments android-arrayadapter