Как получить период, когда данные загружаются, чтобы перестать мерцать?
Я использую 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);
}