Я получаю дубликаты данных в RecyclerView
при получении данных.
Я пробовал такой способ NotifyDataSetChanged()
и setHasStableIds (true)
. Но все равно не удалось, и я попробовал этот способ ( Как решить дубликаты элементов данных в программе восстановления_1007 *), но все еще не удалось его завершить.
private void loadFirstPage() {
Log.d(TAG, "loadFirstPage: ");
callTopRatedMoviesApi().enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if (!response.isSuccessful()) {
Log.e(TAG, "Response Error : " + response.code());
} else {
try {
JSONObject jsonObject = new JSONObject(response.body().toString());
JSONObject dataObject = jsonObject.getJSONObject("data");
JSONArray itemsObject = dataObject.getJSONArray("items");
modelGetProductSearchList = new ArrayList<>();
progressBar.setVisibility(View.GONE);
if (itemsObject.length() == 0) {
// Set GONE Visibility of TextView
} else {
for (int a = 0; a <= itemsObject.length(); a++) {
JSONObject object = itemsObject.getJSONObject(a);
ModelGetProductSearch modelGetProductSearch = new ModelGetProductSearch();
modelGetProductSearch.setId(object.getInt("id"));
modelGetProductSearch.setName(object.getString("name"));
JSONObject sourceObject = object.getJSONObject("source");
modelGetProductSearch.setSourceNames(sourceObject.getString("name"));
modelGetProductSearchList.add(modelGetProductSearch);
adapter.addAll(modelGetProductSearchList);
progressBar.setVisibility(View.GONE);
tvTidakAdaHasil.setVisibility(View.GONE);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
if (currentPage <= TOTAL_PAGES && currentPage <= adapter.getItemCount()) adapter.addLoadingFooter();
else isLastPage = true;
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
Log.e(TAG, "onFailure: " + t.getMessage());
tvTidakAdaHasil.setText("Maaf, cek koneksi internet anda dan coba kembali");
progressBar.setVisibility(View.GONE);
}
});
}
private void loadNextPage() {
Log.d(TAG, "loadNextPage: " + currentPage);
callTopRatedMoviesApi().enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
adapter.removeLoadingFooter();
isLoading = false;
if (!response.isSuccessful()) {
Log.e(TAG, "Response Error : " + response.code());
} else {
try {
JSONObject jsonObject = new JSONObject(response.body().toString());
JSONObject dataObject = jsonObject.getJSONObject("data");
JSONArray itemsObject = dataObject.getJSONArray("items");
modelGetProductSearchList = new ArrayList<>();
progressBar.setVisibility(View.GONE);
for (int a = 0; a <= itemsObject.length(); a++) {
JSONObject object = itemsObject.getJSONObject(a);
ModelGetProductSearch modelGetProductSearch = new ModelGetProductSearch();
modelGetProductSearch.setId(object.getInt("id"));
modelGetProductSearch.setName(object.getString("name"));
JSONObject sourceObject = object.getJSONObject("source");
modelGetProductSearch.setSourceNames(sourceObject.getString("name"));
modelGetProductSearchList.add(modelGetProductSearch);
adapter.addAll(modelGetProductSearchList);
progressBar.setVisibility(View.GONE);
}
} catch (JSONException e) {
e.printStackTrace();
}
if (currentPage != TOTAL_PAGES && currentPage <= adapter.getItemCount()) adapter.addLoadingFooter();
else isLastPage = true;
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
Log.e(TAG, "onFailure: " + t.getMessage());
tvTidakAdaHasil.setText("Maaf, cek koneksi internet anda dan coba kembali");
progressBar.setVisibility(View.GONE);
}
});
}
, и это мой адаптер
public class AdapterDetailSearch extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int ITEM = 0;
private static final int LOADING = 1;
private List<ModelGetProductSearch> modelGetProductSearchList;
private Context context;
private boolean isLoadingAdded = false;
public AdapterDetailSearch(Context context) {
this.context = context;
modelGetProductSearchList = new ArrayList<>();
}
public List<ModelGetProductSearch> getMovies() {
return modelGetProductSearchList;
}
public void setMovies(List<ModelGetProductSearch> movieResults) {
this.modelGetProductSearchList = movieResults;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case ITEM:
viewHolder = getViewHolder(parent, inflater);
break;
case LOADING:
View v2 = inflater.inflate(R.layout.row_item_progress, parent, false);
viewHolder = new LoadingVH(v2);
break;
}
return viewHolder;
}
@NonNull
private RecyclerView.ViewHolder getViewHolder(ViewGroup parent, LayoutInflater inflater) {
RecyclerView.ViewHolder viewHolder;
View viewHolder = inflater.inflate(R.layout.row_item_detail_list, parent, false);
return new MovieVH(viewHolder);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
final ModelGetProductSearch result = modelGetProductSearchList.get(position);
switch (getItemViewType(position)) {
case ITEM:
final MovieVH itemsListVH = (MovieVH) holder;
// Visible and Invisible set TextView
}
}
@Override
public int getItemCount() {
return modelGetProductSearchList == null ? 0 : modelGetProductSearchList.size();
}
@Override
public int getItemViewType(int position) {
return (position == modelGetProductSearchList.size() - 1 && isLoadingAdded) ? LOADING : ITEM;
}
/*
Helpers
_________________________________________________________________________________________________
*/
public void add(ModelGetProductSearch r) {
modelGetProductSearchList.add(r);
notifyItemInserted(modelGetProductSearchList.size() - 1);
}
public void addAll(List<ModelGetProductSearch> moveResults) {
for (ModelGetProductSearch result : moveResults) {
add(result);
}
}
public void remove(ModelGetProductSearch r) {
int position = modelGetProductSearchList.indexOf(r);
if (position > -1) {
modelGetProductSearchList.remove(position);
notifyItemRemoved(position);
}
}
public void clear() {
isLoadingAdded = false;
while (getItemCount() > 0) {
remove(getItem(0));
}
}
public boolean isEmpty() {
return getItemCount() == 0;
}
public void addLoadingFooter() {
isLoadingAdded = true;
add(new ModelGetProductSearch());
}
public void removeLoadingFooter() {
isLoadingAdded = false;
int position = modelGetProductSearchList.size() - 1;
ModelGetProductSearch result = getItem(position);
if (result != null) {
modelGetProductSearchList.remove(position);
notifyItemRemoved(position);
}
}
public ModelGetProductSearch getItem(int position) {
return modelGetProductSearchList.get(position);
}
/*
View Holders
_________________________________________________________________________________________________
*/
/**
* Main list's content ViewHolder
*/
protected class MovieVH extends RecyclerView.ViewHolder {
private LinearLayout llContainer;
private ImageView ivItem;
private TextView tvItemTitle, tvPriceRegular, tvPriceAfterDiscount, textFrom;
public MovieVH(View itemView) {
super(itemView);
llContainer = itemView.findViewById(R.id.container);
ivItem = itemView.findViewById(R.id.iv_item);
textFrom = itemView.findViewById(R.id.tv_from);
}
}
protected class LoadingVH extends RecyclerView.ViewHolder {
public LoadingVH(View itemView) {
super(itemView);
}
}
}