0

У меня две модели - это сообщение и пользователь. Фрагмент Я получаю список сообщений и список пользователей с asyncTaskAdapters, и я хочу отображать данные из этих списков в элементе списка.Как заполнить данные списка из класса пользователя и класса сообщений

It`s fragmant, который должен отображать некоторые сообщения и пользователи называют

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 секунд, чтобы отобразить пользователей. Как синхронизировать отображение этих списков?

и важный момент:

Каждое сообщение имеет user_id, поэтому, когда я получил список сообщений из БД с dialogsAsyncLoader Я строю линии, которые содержат user_ids, то я использую эту линию идентификаторов для выполнения запрос для получения списка пользователей

+0

Возможно, вы захотите уменьшить образец кода до минимального фрагмента, воспроизводящего проблему. Я сомневаюсь, что многие люди захотят прочитать стену кода, который вы получили там. – mustaccio

ответ

0

Итак, я предполагаю, что вы загружаете данные из локальной базы данных. Если это так, я предлагаю вам загрузить все за один выстрел. Определите новый объект, который может выглядеть так:

UserWithMessages { 
    User mUser; 
    Message[] mMessages; 
} 

и укажите свой загрузчик, чтобы вернуть этот тип объектов. Вы можете загрузить данные и адаптировать их к этому новому типу в методе фоновой загрузки от загрузчика.

В качестве альтернативы, если вы настаиваете на продолжении своего текущего решения, вы можете простую проверку в вашем соответствующем загрузчике «onLoadFinish», чтобы проверить, завершен ли другой, и установить адаптер с обоими списками (пользователями и сообщениями) на в то же время. Разумеется, какой-то прогресс является желательным, если вы говорите, что требуется несколько секунд.

Смежные вопросы