
这篇毫无头绪,供个人查阅。
RecyclerView 必知必会
抽丝剥茧RecyclerView - 化整为零
RecyclerView的四大组成是:
Android中使用RecyclerView + SnapHelper实现类似ViewPager效果
让你明明白白的使用RecyclerView——SnapHelper详解
Android SnapHelper扒皮分析
SnapHelper硬核讲解
用RecyclerView做一个小清新的Gallery效果 ,之前项目中也做过卡片滑动,过程中缩放的功能。
>
用户引导滑动,到最后一张的时候,我认为理想的是同时具备以下两点:
1)用户可以点击上面的“开始使用”这样的按钮可以进入主界面;
2)用户接着滑动下一个的手势而进入主界面;
3)用户在引导界面点击返回键的时候直接进入主界面;
增加“开始使用”按钮方式:
可以定义一个layout的xml再加载:一个LinearLayout,里面一个button。默认button是“gone”,
xml如下:
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android=">
ViewPager2实际是内部的 RecyclerView 在起作用,所以ViewPager2一定要设置 RecyclerViewAdapter 赋值,并且Adapter的ItemView的布局必须为 match_parent 。才能正常使用。 ViewPager2+Fragment 提供了一个新的适配器 FragmentStateAdapter 。
FragmentStateAdapter实例
Activity中为Viewpager2初始化设置Adapter
以上就是ViewPager2的使用和属性设置,功能还是比较强大的,接下来看看Viewpager2的源码进行原理分析。
从ViewPager2的构造函数开始分析:
在ViewPager2的构造方法中都会调用 initialize 方法进行初始化,其中实例化了一个封装的RecyclerView,并为这个RecyclerView设置了 layoutManager、OnScrollListener监听、SnapHelper 。
ScrollEventAdapter 直译意思是:滑动事件适配器。类如其名,它的作用就是将RecyclerView的滑动事件 适配成ViewPager2的OnPageChangeCallback的事件
ScrollEventAdapter作为一个 RecyclerViewOnScrollListener 的实例类。在监听RecyclerView的滑动状态的两个方法 onScrollStateChanged、onScrolled 中,根据不同的状态调用 dispatchStateChanged、dispatchSelected、dispatchScrolled 设配成ViewPager2的页面滑动接口 OnPageChangeCallback 。
PageTransformerAdapter 是 ViewPager2OnPageChangeCallback 的实例类,作用是把 OnPageChangeCallbackonPageScrolled 的事件适配成 PageTransformertransformPage() 事件。
先看看 PageTransformerAdapter 在ViewPager2被调用的地方:
PageTransformerAdapter的作用就是为ViewPager2的PageTransformer,在页面滑动的时候转换成PageTransformer transformPage()。其中的transformPage(@NonNull View page, float position)方法的参数值可以参考这篇文章 PageTransformer详解 。ViewPager2如果想要实现页面之间的转换时动画可以重写 PageTransformer
FragmentStateAdapter 是谷歌为我们实现适配加载 Fragment 的 RecyclerViewAdapter ,如果我们想用ViewPager2加载Fragment页面,就可以继承 FragmentStateAdapter 作为适配器,只要重写其 构造方法 和 createFragment 、 getItemCount 。
这就是一个简易版的ViewPager2的FragmentAdapter。由此可见FragmentStateAdapter帮我们实现了Adapter的 onCreateViewHolder 、 onBindViewHolder 抽象方法。在 onCreateViewHolder 方法中创建了一个以 FrameLayout 为父类的View装载 Fragment 。
在重写的 onCreateViewHolder 方法中,通过 FragmentViewHoldercreate 创建一个以 FrameLayout 为父容器的ItemView。
在重写的 onBindViewHolder 方法中,1 先检测ItemView是否有加载过Fragment,如果加载过的Fragment与现在的Fragment不相同,则对ItemView和三个HashMap进行数据清空。2 对两个HashMap设置新的数据。 3 如果存在特殊情况,则当ItemView添加在到RecyclerView中才加载Fragment。
在ItemView依附在RecyclerView时,开始加载Fragment
具体能有多少个ItemView依附在RecyclerView中,取决于ViewPager2的缓存大小。
加载Fragment的流程在就在 placeFragmentInViewHolder 方法里,通过检查fragment和View的状态分别作出不同的 *** 作。
关于ViewPager2的源码浅析就讲完了,下面总结一下:
ScrollEventAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的OnPageChangeCallBack 。
PageTransformerAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的PageTransformer 。
FragmentStateAdapter 的作用:是为ViewPager2加载 Fragment提供基础的Adapter 。
Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现循环滚动代码如下:
1、首先是布局文件,使用了一个ViewPager控件:
<span style="padding: 0px; margin: 0px; font-size: 14px;"><RelativeLayout xmlns:android=";
2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:
<span style="padding: 0px; margin: 0px; font-size: 14px;">package comexampleviewpagertest;import javautilList;
import androidsupportv4viewPagerAdapter;
import androidviewView;
import androidviewViewGroup;
import androidwidgetImageView;
class ViewPagerAdapter extends PagerAdapter {
private List<ImageView> mImageViewList;
public ViewPagerAdapter(List<ImageView> imageViewList) {
super();
thismImageViewList = imageViewList;
}
/
该方法将返回所包含的 Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
其实这并非是真正的无限循环。
/
@Override
public int getCount() {
return IntegerMAX_VALUE;
}
/
判断出去的view是否等于进来的view 如果为true直接复用
/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
/
销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来,就是position,
因为mImageViewList只有五条数据,而position将会取到很大的值,
所以使用取余数的方法来获取每一条数据项。
/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
containerremoveView(mImageViewListget(position % mImageViewListsize()));
}
/
创建一个view,
/
@Override
public Object instantiateItem(ViewGroup container, int position) {
containeraddView(mImageViewListget(position % mImageViewListsize()));
return mImageViewListget(position % mImageViewListsize());
}
}
</span>
3、最后是主界面部分的代码:
<span style="padding: 0px; margin: 0px; font-size: 14px;">package comexampleviewpagertest;import javautilArrayList;
import javautilList;
import androidappActivity;
import androidosBundle;
import androidosHandler;
import androidosMessage;
import androidosSystemClock;
import androidsupportv4viewViewPager;
import androidsupportv4viewViewPagerOnPageChangeListener;
import androidviewView;
import androidwidgetImageView;
import androidwidgetLinearLayout;
import androidwidgetLinearLayoutLayoutParams;
import androidwidgetTextView;
public class MainActivity extends Activity implements OnPageChangeListener {
private List<ImageView> imageViewList;
private TextView tvDescription;
private LinearLayout llPoints;
private String[] imageDescriptions;
private int previousSelectPosition = 0;
private ViewPager mViewPager;
private boolean isLoop = true;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
superhandleMessage(msg);
mViewPagersetCurrentItem(mViewPagergetCurrentItem() + 1);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setView();
initView();
}
public void setView() {
setContentView(Rlayoutactivity_splash_viewpager);
// 自动切换页面功能
new Thread(new Runnable() {
@Override
public void run() {
while (isLoop) {
SystemClocksleep(2000);
handlersendEmptyMessage(0);
}
}
})start();
}
public void initView() {
mViewPager = (ViewPager) findViewById(Ridviewpager);
tvDescription = (TextView) findViewById(Ridtv_image_description);
llPoints = (LinearLayout) findViewById(Ridll_points);
prepareData();
ViewPagerAdapter adapter = new ViewPagerAdapter(imageViewList);
mViewPagersetAdapter(adapter);
mViewPagersetOnPageChangeListener(this);
tvDescriptionsetText(imageDescriptions[previousSelectPosition]);
llPointsgetChildAt(previousSelectPosition)setEnabled(true);
/
2147483647 / 2 = 1073741820 - 1
设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动
/
int n = IntegerMAX_VALUE / 2 % imageViewListsize();
int itemPosition = IntegerMAX_VALUE / 2 - n;
mViewPagersetCurrentItem(itemPosition);
}
private void prepareData() {
imageViewList = new ArrayList<ImageView>();
int[] imageResIDs = getImageResIDs();
imageDescriptions = getImageDescription();
ImageView iv;
View view;
for (int i = 0; i < imageResIDslength; i++) {
iv = new ImageView(this);
ivsetBackgroundResource(imageResIDs[i]);
imageViewListadd(iv);
// 添加点view对象
view = new View(this);
viewsetBackgroundDrawable(getResources()getDrawable(Rdrawablepoint_background));
LayoutParams lp = new LayoutParams(5, 5);
lpleftMargin = 10;
viewsetLayoutParams(lp);
viewsetEnabled(false);
llPointsaddView(view);
}
}
private int[] getImageResIDs() {
return new int[]{
Rdrawablebg1,
Rdrawablebg2,
Rdrawablebg3,
Rdrawablepic_01,
Rdrawablepic_02
};
}
private String[] getImageDescription() {
return new String[]{
"第一个引导页面",
"第二个引导页面",
"第三个引导页面",
"第四个引导页面",
"第五个引导页面"
};
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
// 改变的描述信息
tvDescriptionsetText(imageDescriptions[position % imageViewListsize()]);
// 切换选中的点,把前一个点置为normal状态
llPointsgetChildAt(previousSelectPosition)setEnabled(false);
// 把当前选中的position对应的点置为enabled状态
llPointsgetChildAt(position % imageViewListsize())setEnabled(true);
previousSelectPosition = position % imageViewListsize();
}
@Override
protected void onDestroy() {
superonDestroy();
isLoop = false;
}
}
</span>
以上就是关于关于RecyclerView全部的内容,包括:关于RecyclerView、android recyclerview怎么设置每次只能滑动一页、viewPager滑动到最后一张怎么进入下个页面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)