Данные загружаются очень долго, и данные не отображаются в RecyclerView. - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть RecyclerView, где должен отображаться набор групп.Теперь индикатор выполнения отображается долгое время, а группы не отображаются.Я использую модификацию для получения групп.Индикатор выполнения загружается в течение длительного времени, и когда индикатор выполнения исчезает.Данные не отображаются.

Это java-файл

 private void getAllGroups(int offset, int limit) {
    if (offset == 0) {
        relativeLayout.setVisibility(View.VISIBLE);

        progressBar.setVisibility(View.VISIBLE);
    } else {
        loadLayout.setVisibility(View.VISIBLE);
    }

    Call<List<TrendingGroupsResponse>> allGroupsCall = retrofit.getAllMajorGroups(String.valueOf(offset), String.valueOf(limit));
    Callback<List<TrendingGroupsResponse>> allGroupsCallBack = new Callback<List<TrendingGroupsResponse>>() {
        @Override
        public void onResponse(Call<List<TrendingGroupsResponse>> call, Response<List<TrendingGroupsResponse>> response) {

            if (response.body() != null) {

                Gson gson = new Gson();
                Log.d(TAG, gson.toJson(response.body()));

                for (TrendingGroupsResponse response1 : response.body())
                    allGroupsList.add(new SelectionGroupItem(response1));

                if (response.body().size() < limit) {
                    reachedEnd = true;
                }
                loadmore = true;

                if (offset == 0) {
                    allGroupsAdapter = new GroupSelectionTrendingAdapter(getApplicationContext(),
                            allGroupsList, GroupSelectionActivity.this, ALL_GROUPS_MODE);

                    allGroups.setAdapter(allGroupsAdapter);

                } else if (allGroupsAdapter != null) 
                    allGroupsAdapter.notifyDataSetChanged();
                }

                groupSelectLayout.setVisibility(View.VISIBLE);
                mainlayout.setVisibility(View.VISIBLE);
                relativeLayout.setVisibility(View.GONE);
                progressBar.setVisibility(View.GONE);
                loadLayout.setVisibility(View.GONE);
            }
        }

        @Override
        public void onFailure(Call<List<TrendingGroupsResponse>> call, Throwable t) {


            View view = findViewById(R.id.root_view);
            Snackbar snackbar = Snackbar.make(view, "Network Error", Snackbar.LENGTH_INDEFINITE)
                    .setAction("RELOAD", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            getTrendingGroups();
                            getAllGroups(offset, limit);
                        }
                    });
            snackbar.show();

        }
    };
    allGroupsCall.enqueue(allGroupsCallBack);
}

Как решить эту проблему, чтобы данные загружались и отображались?

1 Ответ

0 голосов
/ 26 декабря 2018

Может быть, вы можете попытаться объявить адаптер над всеми вызовами методов (как в методе onCreate() вашего GroupSelectionActivity)

allGroupsAdapter = new GroupSelectionTrendingAdapter(
    getApplicationContext(), 
    new ArrayList<SelectionGroupItem>(), 
    GroupSelectionActivity.this, 
    ALL_GROUPS_MODE
);

// Considering allGroups is your RecyclerView
allGroups.setAdapter(allGroupsAdapter);

Затем в GroupSelectionTrendingAdapter выставить метод updateData(List<SelectionGroupItem> items)

@UiThread
public void updateData(List<SelectionGroupItem> newItems) {
    /** 
     * this.selectionGroupItems is a property of GroupSelectionTrendingAdapter 
     * that is used to display the data. 
     *
     * It is init in the constructor, then it never changes 
     * and is never reset using the = operator
     */ 
    this.selectionGroupItems.clear()
    this.selectionGroupItems.addAll(newItems)
    // On the UI thread, as it is updating UI items.
    this.notifyDataSetChanged()
}

А затем в вашем обратном вызове:

if (response.body() != null) {
    // ...
    for (TrendingGroupsResponse response1 : response.body())
        allGroupsList.add(new SelectionGroupItem(response1));

    // not needed anymore if (offset == 0) {

    // Call is wrapped to run on the UI thread
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            allGroupsAdapter.updateData(allGroupsList);
        }
    });

    // ...
}

Таким образом, адаптер никогда не меняется, он устанавливается в самом начале жизни вашего экрана.Единственное, что изменяется, - это данные, которые вы отображаете в.

runOnUiThread существует, чтобы гарантировать, что вызов сделан в отображающей ветке

NB. Также, яЯ не уверен, почему вы даете getApplicationContext() своему адаптеру, так как GroupSelectionActivity.this также является контекстом.Пожалуйста, напомните, что не храните ссылки на действия в представлениях, которые могут быть уничтожены, сохраняя ссылку (утечки памяти)

...