Я проверил много вопросов, чтобы исправить мою проблему, но безуспешно, и это исправит 3 проблемы для меня, большие!
Я анализирую свои видео на YouTube с помощью Gson и Retrofit, и это показало успешно, но после последних результатов он возвращает одни и те же элементы снова и снова.
Здесь я вызываю мою функцию, используемую для разбора видео ..
// NestedScrollView used instead of using
// RecyclerView as NestedScrollView disables
// scroll listeners of recycler so, we use nested.
NestedScrollView nestedScrollView = findViewById(R.id.nested_scrollview);
nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) && scrollY > oldScrollY) {
getJson();
}
});
if (videoList.size() == 0) {
getJson();
}
}
А вот мой get Json, который разбирает мои видео ...
// Get Json Data
private void getJson() {
shimmer.setVisibility(View.VISIBLE);
// Parsed Url
String url = YoutubeAPI.BASE_URL + YoutubeAPI.SEARCH + YoutubeAPI.KEY + YoutubeAPI.CHANNNEL_ID + YoutubeAPI.ORDER + YoutubeAPI.MAX_RESULTS + YoutubeAPI.PART;
if (!nextPageToken.equals("")) {
// Add page token to new url
url += (YoutubeAPI.NEXT_PAGE_TOKEN + nextPageToken);
shimmer.setVisibility(View.GONE);
}
if (nextPageToken == null) {
return;
}
Call<YoutubeMain> data = YoutubeAPI.getMainVideo().getYoutube(url);
data.enqueue(new Callback<YoutubeMain>() {
@Override
public void onResponse(Call<YoutubeMain> call, Response<YoutubeMain> response) {
if (response.errorBody() != null) {
Log.v("TAG", "onResponse: " + response.errorBody());
shimmer.setVisibility(View.GONE);
// Print error code
Toast.makeText(YoutubeActivity.this, response.errorBody().toString(), Toast.LENGTH_SHORT).show();
} else {
YoutubeMain youtubeMain = response.body();
assert youtubeMain != null;
videoList.addAll(youtubeMain.getItems());
adapter.notifyDataSetChanged();
shimmer.setVisibility(View.GONE);
// Get nextPageToken to assign it to new url
if (youtubeMain.getNextPageToken() != null) {
nextPageToken = youtubeMain.getNextPageToken();
}
// Get creatorName to assign it to author
if (youtubeMain.getItems().get(0).getSnippet().getChannelTitle() != null) {
author.setText(youtubeMain.getItems().get(0).getSnippet().getChannelTitle());
}
}
}
@Override
public void onFailure(Call<YoutubeMain> call, Throwable t) {
shimmer.setVisibility(View.GONE);
// Print error code
Toast.makeText(YoutubeActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
это мой адаптер ...
public class YoutubeMainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<YoutubeVideo> videoList;
private final OnYoutubeItemClickListener listener;
private String formatted_date;
public YoutubeMainAdapter(Context context, List<YoutubeVideo> videoList, OnYoutubeItemClickListener listener) {
this.videoList = videoList;
this.listener = listener;
}
class YoutubeHolder extends RecyclerView.ViewHolder {
ImageView thumbnail;
TextView title, description, publishedAt;
YoutubeHolder(@NonNull View itemView) {
super(itemView);
thumbnail = itemView.findViewById(R.id.ImageThumb);
title = itemView.findViewById(R.id.textViewTitle);
description = itemView.findViewById(R.id.textViewDes);
publishedAt = itemView.findViewById(R.id.textViewDate);
}
public void setData(YoutubeVideo data) {
String getTitle = data.getSnippet().getTitle();
String getDescription = data.getSnippet().getDescription();
String getPublishedAt = format_date(data.getSnippet().getPublishedAt());
String getThumbnail = data.getSnippet().getThumbnails().getHigh().getUrl();
title.setText(getTitle);
description.setText(getDescription);
publishedAt.setText(getPublishedAt);
Picasso.get()
.load(getThumbnail)
.into(thumbnail);
}
void bind(final YoutubeVideo item, final OnYoutubeItemClickListener listener) {
itemView.setOnClickListener(v -> listener.onItemClick(item));
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_youtube_listitem, parent, false);
return new YoutubeHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
YoutubeVideo youtubeVideo = videoList.get(position);
YoutubeHolder youtubeHolder = (YoutubeHolder) holder;
youtubeHolder.setData(youtubeVideo);
youtubeHolder.bind(videoList.get(position), listener);
}
private String format_date(String publishedAt) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
@SuppressLint("SimpleDateFormat") SimpleDateFormat format = new SimpleDateFormat("dd, MMM yyyy • hh:mm a");
Date date = dateFormat.parse(publishedAt);
assert date != null;
formatted_date = format.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return formatted_date;
}
@Override
public int getItemCount() {
return videoList.size();
}
}
Я много раз пытался исправить это, но безуспешно, и после проверки некоторых вопросов, связанных с этой проблемой, все ответы были для (для l oop) с обычным Json разбором и без Gson. заранее спасибо, и я ценю помощь.