当前位置:网站首页>La différence entre viewpager 2 et viewpager et la mise en œuvre de la rotation viewpager 2
La différence entre viewpager 2 et viewpager et la mise en œuvre de la rotation viewpager 2
2022-07-07 09:35:00 【Cheng @ @ Cheng】
Catalogue des articles
Préface:
2019DébutGooglePubliéViewPager2Aperçu,Et la même annéeI/OLancement de la version officielle.Tant que tu es passé deSupporLa Bibliothèque passe àAndroidX,Vous pouvez utiliserViewPager2Remplacer complètement l'ancienViewPager.
ViewPager2La caractéristique la plus remarquable est basée surRecyclerViewRéalisation,RecyclerViewOui, pour le moment.AndroidLe plus matureAdapterViewSolutions,Cela apporte beaucoup d'avantages:
1、Abandonner la traditionPagerAdapter,Unis.AdapterDeAPI/
2、AdoptionLinearLayoutManagerIl est possible de réaliser un glissement longitudinal semblable à un tremblement de terre
3、SoutienDiffUitl,Peut passerdiffActualiser localement
4、SoutienRTL(right-to-left)Mise en page,Pour ceux qui ont besoin d'aller en merAPPTrès utile.
5、SoutienItemDecorator
Un.、ViewPager2EtViewPagerComparaison:
1、ViewPager2La mise en œuvre interne estRecyclerView,Alors...ViewPager2Plus de performance.
2、ViewPager2 Le glissement vertical peut être réalisé ,ViewPager Glissement latéral seulement .
3、ViewPager2Un seuladapter,FragmentStateAdapterDeRecyclerView.Adapter.
EtViewPagerIl y en a deux.adapter,FragmentStatePagerAdapterEtFragmentPagerAdapter, C'est l'héritage PagerAdapter.FragmentStatePagerAdapterEtFragmentPagerAdapterLa différence estFragmentStatePagerAdapterImpossible de mettre en cache,FragmentPagerAdapterPeut être mis en cache.
4、ViewPager2 Le mode permet un chargement paresseux , Pas de précharge par défaut .L'intérieur passe parLifecycle C'est exact. Fragment Gestion du cycle de vie.ViewPager Le précharge est effectué , Le chargement paresseux exige que nous le fassions nous - mêmes .
| ViewPager | ViewPager2 | |
|---|---|---|
| Adapter | ViewPager | RecyclerView.Adapter |
| Surveillance coulissante | addPageChangeListener | registerOnPageChangeCallback |
| Aucune | De droite à gauche (RTL) Support de mise en page pour | |
| Aucune | Support vertical | |
| Aucune | Désactiver la fonction entrée par l'utilisateur (setUserInputEnabled、isUserInputEnabled) |
2.、ViewPager2Utilisation de(Réalisation du diagramme de rotation)
1、Obtenir des résultats

2、Code de mise en œuvre
a、XMLMise en page
<RelativeLayout android:layout_width="match_parent" android:layout_height="200dp">
<!--La carte de la rotation-->
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/homeFragment_view_banner" android:layout_width="match_parent" android:layout_height="200dp" android:orientation="horizontal" />
<!-- Ponctuation inférieure -->
<LinearLayout android:id="@+id/homeFragment_view_dot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="5dp"/>
</RelativeLayout>
b、Adaptateur
Disposition de l'adaptateur
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >
<ImageView android:id="@+id/itemBanner_iv_img" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="fitXY"/>
</RelativeLayout>
Code de l'adaptateur
public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.ViewHolder> {
private Context context;
private List<Integer> imgUrl;
public BannerAdapter(Context context,List<Integer> imgUrl){
this.context = context;
this.imgUrl = imgUrl;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout_banner,parent,false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Glide.with(context).load(imgUrl.get(position)).into(holder.iv_img);
}
@Override
public int getItemCount() {
return imgUrl.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
ImageView iv_img;
public ViewHolder(View itemView) {
super(itemView);
iv_img = itemView.findViewById(R.id.itemBanner_iv_img);
}
}
}
c、CompletActivityCode
UtiliserHandler Et thread pour réaliser la fonction de rotation ,UtiliserLinearLayoutAjouter dynamiquement des points.
private ViewPager2 view_banner;
private LinearLayout layout_dot;
private List<Integer> imgUrl;
private List<ImageView> dotList;
private BannerAdapter bannerAdapter;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
initViews(view);
return view;
}
/* Quand l'application est réveillée , Laissez la carte de la roue commencer la roue */
@Override
public void onResume() {
super.onResume();
handler.postDelayed(runnable,5000);
}
/* Lorsque l'application est suspendue , Pour arrêter la roue */
@Override
public void onPause() {
super.onPause();
handler.removeCallbacks(runnable);
}
private void initViews(View view) {
view_banner = view.findViewById(R.id.homeFragment_view_banner);
layout_dot= view.findViewById(R.id.homeFragment_view_dot);
imgUrl = new ArrayList<>();
dotList = new ArrayList<>();
imgUrl.add(R.mipmap.aa);
imgUrl.add(R.mipmap.ab);
bannerAdapter = new BannerAdapter(context,imgUrl);
view_banner.setAdapter(bannerAdapter);
initIndicatorDots();
// Enregistrez l'auditeur d'événements de défilement pour le diagramme de roue
view_banner.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
// Lors de la rotation , Modifier le point d'indication
super.onPageSelected(position);
for(int i = 0; i < dotList.size(); i++){
if(i==position){
dotList.get(i).setBackgroundResource(R.drawable.shape_dot_blue);
}else{
dotList.get(i).setBackgroundResource(R.drawable.shape_dot_gray);
}
}
}
});
}
// Initialiser le point d'indication
private void initIndicatorDots(){
for(int i = 0; i < imgUrl.size(); i++){
ImageView imageView = new ImageView(context);
if (i == 0) imageView.setBackgroundResource(R.drawable.shape_dot_blue);
else imageView.setBackgroundResource(R.drawable.shape_dot_gray);
// Ajouter un espacement pour les points indicateurs
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0,0,10,0);
imageView.setLayoutParams(layoutParams);
int index = i;
imageView.setOnClickListener(new View.OnClickListener() {
// Cliquez sur l'effet de clic pour basculer la fonction
@Override
public void onClick(View v) {
view_banner.setCurrentItem(index);
for(ImageView iv :dotList){
iv.setBackgroundResource(R.drawable.shape_dot_gray);
}
v.setBackgroundResource(R.drawable.shape_dot_blue);
}
});
dotList.add(imageView);
layout_dot.addView(imageView); // Ajouter un point d'indication au conteneur
}
}
private final Runnable runnable = new Runnable() {
@Override
public void run() {
int currentPosition = view_banner.getCurrentItem(); // Obtenir l'emplacement actuel du diagramme de rotation
currentPosition++;
if(currentPosition==imgUrl.size()){
//Recommencer
view_banner.setCurrentItem(0,true);
}else{
view_banner.setCurrentItem(currentPosition,true);
}
handler.postDelayed(runnable,5000);
}
};
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
边栏推荐
- Over 100000 words_ Ultra detailed SSM integration practice_ Manually implement permission management
- Kubernetes cluster capacity expansion to add node nodes
- 网易云微信小程序
- Information Security Experiment 3: the use of PGP email encryption software
- Unity shader (basic concept)
- Postman interface debugging method
- Self awakening from a 30-year-old female programmer
- Lesson 1: hardness of eggs
- The use of recycling ideas
- How to speed up video playback in browser
猜你喜欢
![[bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction](/img/7f/d0917366c68865222154d82b9e7b40.png)
[bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction

Nested (multi-level) childrn routes, query parameters, named routes, replace attribute, props configuration of routes, params parameters of routes

Regular matching starts with XXX and ends with XXX

浏览器中如何让视频倍速播放

Pytest installation (command line installation)

ComputeShader

Octopus future star won a reward of 250000 US dollars | Octopus accelerator 2022 summer entrepreneurship camp came to a successful conclusion

Over 100000 words_ Ultra detailed SSM integration practice_ Manually implement permission management

Vs2013 generate solutions super slow solutions

Dynamics 365Online ApplicationUser创建方式变更
随机推荐
scrapy爬虫mysql,Django等
NETCORE 3.1 solves cross domain problems
Install pyqt5 and Matplotlib module
golang select机制和超时问题怎么解决
十二、排序
Pytest installation (command line installation)
LeetCode每日一题(2316. Count Unreachable Pairs of Nodes in an Undirected Graph)
如何成为一名高级数字 IC 设计工程师(5-2)理论篇:ULP 低功耗设计技术精讲(上)
Communication mode between processes
How to solve the problem of golang select mechanism and timeout
# Arthas 简单使用说明
Vs2013 generate solutions super slow solutions
Unity3d interface is embedded in WPF interface (mouse and keyboard can respond normally)
进程间的通信方式
印象笔记终于支持默认markdown预览模式
正则匹配以XXX开头的,XXX结束的
Lecture 1: stack containing min function
[cloud native] Devops (I): introduction to Devops and use of code tool
Entity of cesium data visualization (Part 1)
Postman interface debugging method