在使用 PagerAdapter 和 ViewPager 中的选项卡之间滑动时出现问题

Posted

技术标签:

【中文标题】在使用 PagerAdapter 和 ViewPager 中的选项卡之间滑动时出现问题【英文标题】:Problem in swipe between tabs in Use PagerAdapter and ViewPager 【发布时间】:2018-11-05 10:18:56 【问题描述】:

我将 PagerAdapter 用于 ViewPager 适配器,没有任何片段,只有一个选项卡布局,没关系,我可以放置我的数据,然后......但我在滑动时遇到问题......它是颠倒的......我想要从右向左,但从左向右滑动...

ViewPagerAdapter.java

public class ViewPagerAdapter extends PagerAdapter 


  private static final String TAG = "ViewPagerAdapter";

  private Context context;
  private List<PersonItem> personItemList;

  public ViewPagerAdapter(Context context, List<PersonItem> personItemList) 
    this.context = context;
    this.personItemList = personItemList;
  


  @Override
  public boolean isViewFromObject(@NonNull View view, @NonNull Object object) 
    return view == object;
  


  @Override
  public int getCount() 
    return personItemList.size();
  


  @Override
  public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) 
    container.removeView((View) object);
  


  @Nullable
  @Override
  public CharSequence getPageTitle(int position) 
    return personItemList.get(position).getTabTitle();
  

  @NonNull
  @Override
  public Object instantiateItem(@NonNull ViewGroup container, int position) 

    LayoutInflater inflater = LayoutInflater.from(context);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.fragment_layout, container, false);
    PersonItem personItem = personItemList.get(position);

    ImageView imgPerson = layout.findViewById(R.id.img_person);
    TextView txtPersonContent = layout.findViewById(R.id.txt_person_content);

    if (personItem.getImageUrl() != null) 
      Glide.with(context)
        .load(personItem.getImageUrl())
        .into(imgPerson);
     else 
      imgPerson.setVisibility(View.GONE);
    


    if (personItem.getContent() != null) 
      txtPersonContent.setText(personItem.getContent());
    




    container.addView(layout);

    return layout;
  

ViewPager layout.xml

<?xml version="1.0" encoding="utf-8"?>

<layout
    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">


    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_
        android:layout_
        android:id="@+id/coordinator"
        tools:context=".activity.PersonalityDetailsActivity">

        <com.google.android.material.appbar.AppBarLayout
            android:layout_
            android:layout_
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <include
                android:id="@+id/personality_toolbar"
                layout="@layout/personality_details_toolbar"
                android:layout_
                android:layout_
                android:layout_marginTop="3dp"/>


            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabs"
                android:layout_
                android:layout_
                android:layout_marginTop="5dp"
                android:background="?android:attr/selectableItemBackground"
                android:clickable="true"
                android:contextClickable="true"
                android:focusable="true"
                android:scrollbarSize="30dp"
                android:textAlignment="center"
                android:layoutDirection="rtl"
                app:tabGravity="fill"
                app:tabIndicatorColor="@color/colorAccent"
                app:tabMode="scrollable"
                app:tabPadding="3dp"
                app:tabPaddingEnd="10dp"
                app:tabSelectedTextColor="@color/colorAccent"
                app:tabTextColor="@android:color/white"/>

        </com.google.android.material.appbar.AppBarLayout>

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewpager"
            android:layout_
            android:layout_
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

在活动中设置 ViewPager

//set adapter on View Pager
viewPagerAdapter = new ViewPagerAdapter(this, personItems);
viewPager.setAdapter(viewPagerAdapter);
viewPager.setCurrentItem(0);
tabLayout.setupWithViewPager(viewPager);

输出在这里:

The Gif link

【问题讨论】:

你有什么问题? 你看到 gif 了吗?我想要 RTL 目录,但它是 LTR ... 【参考方案1】:

试试这个

步骤 1. 更改 View 页面的旋转,

viewpager.setRotationY(180);

Step 2. 然后再次改变片段容器的方向 这是viewpager的孩子,

view_pager_fragment_parent_viewgroup.setRotationY(180);

For more info

【讨论】:

tnx 亲爱的,但我的孩子不是 RecyclerView ......亲爱的我找到了它 使用视图组顶部 fragment_layout 而不是 recyclerView Drae Thnx .. 我的情况我有布局并为此设置它。 layout.setRotationY(180)这是我的解决方案【参考方案2】:

您也可以尝试将android:layoutDirection="rtl" 添加到您的ViewPager

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewpager"
    android:layout_
    android:layout_
    android:layoutDirection="rtl"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

并将当前页面设置为最后一页以防万一:

viewPagerAdapter = new ViewPagerAdapter(this, personItems);
viewPager.setAdapter(viewPagerAdapter);
viewPager.setCurrentItem(viewPagerAdapter.getCount() - 1); // instead of 0
tabLayout.setupWithViewPager(viewPager);

【讨论】:

不,亲爱的。这不是我的解决方案......最后一项中的选择器设置和问题尚未 哦,我的错,如果 viewPager.setCurrentItem(viewPagerAdapter.getCount() - 1) 不起作用,也许你可以放弃它,但我可能错了。 亲爱的我该怎么办? 对不起,我的意思是您是否可以尝试将初始当前项目设置为最后一页。我刚刚更新了我的答案。

以上是关于在使用 PagerAdapter 和 ViewPager 中的选项卡之间滑动时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

日历和 PagerAdapter - 无限次查看

Android中PagerAdapter总结

PagerAdapter相关

有关ViewPager使用及解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题

PagerAdapter 中的异步位置

PagerAdapter 总是在 ViewPager 中被调用两次