当前位置:网站首页>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) {
}
};
边栏推荐
- Dynamics 365Online ApplicationUser创建方式变更
- 浏览器中如何让视频倍速播放
- MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
- JS逆向教程第一发
- Jenkins modifies the system time
- Variable parameter of variable length function
- [bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction
- DRF defines views and routes
- Difference between process and thread
- js逆向教程第二发-猿人学第一题
猜你喜欢
随机推荐
Impression notes finally support the default markdown preview mode
超十万字_超详细SSM整合实践_手动实现权限管理
嵌套(多级)childrn路由,query参数,命名路由,replace属性,路由的props配置,路由的params参数
NATAPP内网穿透
在EXCEL写VBA连接ORACLE并查询数据库中的内容
【SVN】SVN是什么?怎么使用?
What development models did you know during the interview? Just read this one
Upload taro pictures to Base64
进程间的通信方式
Lecture 1: stack containing min function
数据建模中利用3σ剔除异常值进行数据清洗
(3/8)枚举的不当用法 之 方法参数(二)
Unity shader (basic concept)
網易雲微信小程序
asp. How to call vb DLL function in net project
浏览器中如何让视频倍速播放
Jenkins automated email
sqlplus乱码问题,求解答
Jemter operation
Unity shader (learn more about vertex fragment shaders)