Как получить период при загрузке данных, чтобы остановить мерцание? - PullRequest
1 голос
/ 30 апреля 2020

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

Вот код в моем фрагменте. Я хочу установить значение 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 true, мерцание работает бесконечно. Поэтому я не могу получить период, когда все данные загружены, чтобы изменить значение isShimmer

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

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

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

А также стоп-шиммер на onPause() и onDestroy()

0 голосов
/ 30 апреля 2020

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


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 = "true"

Поэтому вам не нужно запускать шиммер программно.


2. Задание / фрагмент

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