当前位置:网站首页>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) {
}
};
边栏推荐
- [4g/5g/6g topic foundation-146]: Interpretation of white paper on 6G overall vision and potential key technologies-1-overall vision
- Pick up the premise idea of programming
- js逆向教程第二发-猿人学第一题
- Unity shader (learn more about vertex fragment shaders)
- Cesium does not support 4490 problem solution and cesium modified source code packaging scheme
- flex弹性布局
- Unity shader (basic concept)
- LeetCode每日一题(2316. Count Unreachable Pairs of Nodes in an Undirected Graph)
- MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
- Vs2013 generate solutions super slow solutions
猜你喜欢
ComputeShader
Vs2013 generate solutions super slow solutions
超十万字_超详细SSM整合实践_手动实现权限管理
Dynamics 365online applicationuser creation method change
Mysql数据库-锁-学习笔记
[4G/5G/6G专题基础-147]: 6G总体愿景与潜在关键技术白皮书解读-2-6G发展的宏观驱动力
MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
二叉树高频题型
Information Security Experiment 1: implementation of DES encryption algorithm
Oracle安装增强功能出错
随机推荐
NETCORE 3.1 solves cross domain problems
Communication mode between processes
H5网页播放器EasyPlayer.js如何实现直播视频实时录像?
[4G/5G/6G专题基础-147]: 6G总体愿景与潜在关键技术白皮书解读-2-6G发展的宏观驱动力
Some pit avoidance guidelines for using Huawei ECS
Jenkins automated email
Entity of cesium data visualization (Part 1)
浏览器中如何让视频倍速播放
# Arthas 简单使用说明
其实特简单,教你轻松实现酷炫的数据可视化大屏
Record of structured interview
Serializer & modelserializer of DRF serialization and deserialization
Zen - batch import test cases
Postman data driven
The configuration and options of save actions are explained in detail, and you won't be confused after reading it
[bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction
超十万字_超详细SSM整合实践_手动实现权限管理
Niuke - Huawei question bank (61~70)
Pycharm create a new file and add author information
信息安全实验四:Ip包监视程序实现