最近在做一款app,由于数据加载量比较大,所以加载时长可能比其他app加载速度稍微慢点, 所以加载动画就少不了,但是加载动画感觉效果不是很理想,最后就做了数据预加载处理,大致思路就是这样的,当数据没有加载出来时候,显示一个布局,布局大致和数据加载完成之后的效果一致,然后给view加上动画效果,一个超棒的数据加载动画就搞定了,不再啰嗦,直接上代码。
1.空布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <LinearLayout android:layout_width="@dimen/dp_0" android:layout_height="@dimen/dp_75" android:layout_alignParentLeft="true" android:layout_marginTop="@dimen/dp_5" android:layout_marginBottom="@dimen/dp_5" android:layout_weight="7" android:gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/txt_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp_4" android:background="@color/eeeeee" android:ellipsize="end" android:lineSpacingExtra="@dimen/dp_7" android:maxLines="2" android:text="" android:textColor="@color/black" android:textFontWeight="10" android:textSize="@dimen/sp_16" /> <TextView android:id="@+id/txt_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_4" android:layout_marginRight="@dimen/dp_4" android:background="@color/eeeeee" android:maxLines="1" android:text="" android:textColor="@color/bfbfbf" android:textSize="@dimen/sp_12" /> <TextView android:id="@+id/txt_time2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_4" android:layout_marginRight="@dimen/dp_4" android:background="@color/eeeeee" android:maxLines="1" android:text="" android:textColor="@color/bfbfbf" android:textSize="@dimen/sp_12" /> </LinearLayout> <com.jjb.weduywb.widget.RoundImage android:id="@+id/iv_big" android:layout_width="@dimen/dp_0" android:layout_height="@dimen/dp_75" android:layout_alignParentRight="true" android:layout_marginTop="@dimen/dp_5" android:layout_marginRight="@dimen/dp_4" android:layout_marginBottom="@dimen/dp_5" android:layout_weight="3" android:background="@color/eeeeee" android:scaleType="centerCrop" android:visibility="visible" /> </LinearLayout>
2.adapter定义两个变量一个表示有数据的布局,一个表示无数据的布局
private static final int TYPE_ONLY_FONT = 0;//文字 private static final int EMPTY_VIEW = -1;//空布局
3.重写adaper中的getItemViewType的方法
@Override public int getItemViewType(int position) { if (xx) { return TYPE_ONLY_FONT; }else{ return EMPTY_VIEW; } }
4.在adapter中
onCreateViewHolder判断加载布局
if (viewType == TYPE_ONLY_FONT ) { 有数据的布局 } else if (viewType == EMPTY_VIEW) { 无数据的布局 }
5.
onBindViewHolder在他中加载数据
if (holder instanceof 有数据HoldView) { 有数据HoldView } else if (holder instanceof 无数据HoldView) { 无数据HoldView }
6.
getItemCount
中判断数据是否为空人然后加载数据,如果为空默认加载上几条数据,不然加载效果无法出现
7.空数据中页面显示
private class NoItemHoldView extends RecyclerView.ViewHolder { TextView txtTitle; TextView txtTime; TextView txtTime2; RoundImage imageView; public NoItemHoldView(View itemView) { super(itemView); txtTitle = itemView.findViewById(R.id.txt_title); txtTime = itemView.findViewById(R.id.txt_time); txtTime2 = itemView.findViewById(R.id.txt_time2); imageView = itemView.findViewById(R.id.iv_big); alphaAnimation1.setDuration(1000); alphaAnimation1.setRepeatCount(Animation.INFINITE); alphaAnimation1.setRepeatMode(Animation.RESTART); txtTitle.setAnimation(alphaAnimation1); txtTime.setAnimation(alphaAnimation1); // txtTime2.setAnimation(alphaAnimation1); imageView.setAnimation(alphaAnimation1); alphaAnimation1.start(); } }
到此一个漂亮的加载效果就出现了