#java #android #list #object #merge
Вопрос:
я использую запросы api, которые возвращают список. -первый запрос api возвращает список объектов, которые содержат (идентификатор пользователя,содержимое,дата,название) -второй ответ возвращает список объектов,которые также содержат (идентификатор пользователя, имя пользователя).
я хочу объединить два списка и отобразить их в одном представлении переработчика, но сохранить имя пользователя вместо идентификатора пользователя.это изображение четко разбивает то, что я хочу.
прими любую помощь, я действительно застрял в этом, и она мне нужна, Тай .
Редактировать
это первый вызов api :
followuplist=new ArrayList<>();
Retrofit retrofit = RetrofitInstance.getRetrofitInstance();
final Api api = retrofit.create(Api.class);
Call<List<TraitementTicketModel>> call = api.getfollowup(id, sestoken);
call.enqueue(new Callback<List<TraitementTicketModel>>() {
@Override
public void onResponse(Call<List<TraitementTicketModel>> call, Response<List<TraitementTicketModel>> response) {
if (!response.isSuccessful()) {
Toast.makeText(getApplicationContext(), "Something is wrong !! ", Toast.LENGTH_LONG).show();
Log.e("TAG", "onResponse: something is wrong");
} else if (response.body() == null) {
return;
}
List<TraitementTicketModel> followups = response.body();
for (TraitementTicketModel followup : followups) {
followuplist.add(followup);
}
followuplist.add(firstfollowup());
}
@Override
public void onFailure(Call<List<TraitementTicketModel>> call, Throwable t) {
Toast.makeText(getApplicationContext(),"Pas de connextion internet",Toast.LENGTH_LONG).show();
}
});
это второй вызов api :
List<User> userList;
SharedPreferences sp =getApplicationContext().getSharedPreferences("tokenPref", Context.MODE_PRIVATE);
String sestoken = sp.getString("token","");
Retrofit retrofit= RetrofitInstance.getRetrofitInstance();
final Api api= retrofit.create(Api.class);
Call<List<User>> call = api.getUser(sestoken);
call.enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (response.code() != 200){
Log.e("TAG", "onResponse: something is wrong" response.code() );
}
List<User> users = response.body();
for (User user : users){
userList.add(user);
}
swipeRefreshLayout.setRefreshing(false);
}
итак, у меня есть два списка, первый из которых :
список подписчиков (идентификатор пользователя,заголовок,содержимое,дата)
и второй :
Список пользователей(идентификатор пользователя,имя пользователя)
но я не знал, что делать после этого, чтобы достичь своей цели
Комментарии:
1. С чем именно вы застряли и что вы сделали до сих пор?
2. Опубликуйте свою лучшую попытку решить эту проблему.
3. Хорошо, я собираюсь отредактировать это
4. Если вы не можете выполнить один вызов, чтобы получить необходимую информацию (которую в SQL было бы легко объединить с идентификатором пользователя, чтобы получить все данные сразу за один вызов), вам следует организовать один из списков в карту, где идентификатор пользователя является ключом, а объект-значением. Тогда было бы легко пробежаться по списку, выполнить поиск на карте и создать свой объединенный объект, но опять же, это похоже на проблему, которую следует решить с помощью API,
Ответ №1:
Ты можешь сделать что-то подобное. В этом примере UserDetails
показан объект слева на вашем изображении, UserInfo
объект справа и MergeData
результат.
Вы должны использовать Kotlin вместо Java, так намного проще манипулировать списками.
List<MergedData> mergeList(
List<UserDetails> listUserDetails,
List<UserInfo> listUserInfo
) {
// Resulting list
final List<MergedData> result = new ArrayList<>();
// We iterate through the first list
for (UserDetails details : listUserDetails) {
// For each element of the list we will try to find one with the same user id in the other list
for (UserInfo info : listUserInfo) {
// if the current element of the second list has the same user id as the current one from the first list, we merge the data in a new object and this object is then added to the result list.
if (details.getUserId().equals(info.getUserId())) {
result.add(
new MergedData(
info.getName(),
details.getContent(),
details.getTitre(),
details.getDate()
)
);
// Once the object is found it is unnecessary to continue looping though the second list, so we break the for loop.
break;
}
}
}
// Once we finished to iterate through the first list, we return the result.
return resu<
}
Тот же пример в Котлине:
fun mergeList(
listUserDetails: List<UserDetails>,
listUserInfo: List<UserInfo>
): List<MergedData> =
listUserDetails.mapNotNull { details ->
listUserInfo
.firstOrNull { it.userId == details.userId }
?.let { info ->
MergedData(
info.name,
details.content,
details.titre,
details.date
)
}
}