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

Я использую Volley для запросов и хочу добавить мерцание во время загрузки данных. Я могу выполнить это с помощью Handler, но я не знаю, когда придут данные, и не могу установить точное время.

Вот код в моем фрагменте. Я хочу установить значениеfalse изменять isShimmer И это так быстро, что мое мерцание не гаснет:

String url = "my_url";
JsonArrayRequest getArticleOfTheDayRequest = new JsonArrayRequest(Request.Method.GET, url, null,
            response -> {
                try {
                    for(int i = 0; i < response.length(); i++){
                        JSONObject articleObject = response.getJSONObject(i);
                        int article_id = articleObject.getInt("article_id");
                        String title = articleObject.getString("title");
                        String text = articleObject.getString("text");
                        ArticleOfTheWeek articleOfTheWeek = new ArticleOfTheWeek(article_id, title, text);
                        articleOfTheWeekList.add(articleOfTheWeek);
                    }
                    articleOfTheWeekAdapter = new ArticleOfTheWeekAdapter(getContext(), articleOfTheWeekList);
                    recyclerView.setAdapter(articleOfTheWeekAdapter);
                    articleOfTheWeekAdapter.isShimmer = false;
                    articleOfTheWeekAdapter.notifyDataSetChanged();
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            },
            error -> Log.d("Error.Response", error.getMessage() + " ")
    );

Вот код в моем адаптере:


public boolean isShimmer = true;
int shimmerNumber = 2;

@Override
    public void onBindViewHolder(@NonNull final ArticleOfTheWeekViewHolder holder, int position) {
        final ArticleOfTheWeek articleOfTheWeek = articleOfTheWeekList.get(position);

        if(isShimmer)
        {
            holder.shimmerFrameLayout.startShimmer();
        }else
            {
            holder.shimmerFrameLayout.stopShimmer();
            holder.shimmerFrameLayout.setShimmer(null);

            holder.textViewTitle.setBackground(null);
            holder.textViewTitle.setText(articleOfTheWeek.getTitle());
            holder.textViewDesc.setBackground(null);
            holder.textViewDesc.setText(Html.fromHtml(articleOfTheWeek.getText()));
        }

    }

Как вы видите, если я установил isShimmerправда, мерцание бесконечно. Поэтому я не могу получить период, когда все данные загружены, чтобы изменить значениеisShimmer

2 ответа

Решение

Я использовал это библиотеку для отображения эффекта мерцания при извлечении данных. Сначала установите видимость истинного для вашего мерцающего макета в вашем XML-файле, а затем начните мерцание в начале действияshimmerViewContainer.startShimmer().

Задавать shimmerViewContainer.stopShimmer() в вашем методе залпа после установки данных для вашего адаптера в файле активности.

А также перестань мерцать onPause() а также onDestroy()

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


1. Внутри макета Activity/Fragment

<RelativeLayout>
 <RecyclerView/>
 <FrameLayout 
  android:id="@+id/shimmer_container"> 
 <!-- show hide this FrameLayout container depend on state of data loading/loaded -->
 
  <include layout="@layout/list_shimmer"/>
 </FrameLayout>
</RelativeLayout>

List_shimmer может быть выглядит следующим образом:

<com.facebook.shimmer.ShimmerFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:shimmer_auto_start="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include layout="@layout/just_like_adapter_item_layout" />

        <include layout="@layout/just_like_adapter_item_layout" />

        <!-- repeat until it's enough to fill the screen -->
    </LinearLayout>
</com.facebook.shimmer.ShimmerFrameLayout>

Важное свойство:

app:shimmer_auto_start = "правда"

Таким образом, вам не нужно запускать мерцание программно.


2. Действие / фрагмент

void initList(List<Data> items) {
  adapter.setItems(items);
  shimmer_container.setVisibility(View.GONE);
}

Другие вопросы по тегам