【问题标题】:How to populate in listview data from user class and message class如何从用户类和消息类填充列表视图数据
【发布时间】: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


【解决方案1】:

所以我假设您从本地数据库加载数据。如果是这种情况,我建议您一次性加载所有内容。定义一个可能如下所示的新对象:

UserWithMessages {
    User mUser;
    Message[] mMessages;
}

并定义您的加载器以返回此类对象。您可以从 loader 在后台加载方法中加载数据并使其适应这种新类型。

或者,如果您坚持使用当前的解决方案,您可以在两个相关加载程序'onLoadFinish 中进行简单检查,以检查另一个是否完成并使用两个列表(用户和消息)设置适配器同时。当然,如果你说它需要几秒钟,那么某种进度条是可取的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多