【问题标题】:Why is my PDFView in fragment not showing properly in my viewpager2? I can't seem to show the pdfview properly为什么我的片段中的 PDFView 在我的 viewpager2 中没有正确显示?我似乎无法正确显示 pdfview
【发布时间】:2020-06-29 17:53:45
【问题描述】:

我想使用 viewpager2 从一个片段中显示一页 pdf 文件。所以每一页滚动,我都会从文件路径加载一个 PDFView。因此,如果我有 6 个 pdf 文件,我会将 pdf 文件存储在一个数组中,并通过使用每个 pdf 文件的每个片段将它们全部组合到一个 pdfview 中。

问题是:

当我滚动时,它无法正确加载和显示。 如果我从第 1-6 页滚动,它会在第一次从左到右滚动时正确显示。但是当我回去时,它会显示并且不会显示在某些页面上。 所以这是我的代码:

这是我的 MainActivity.java


  public class MainActivity extends AppCompatActivity {


    private ViewPager2 viewPager;
    private PDF_FragmentAdapter adapter;
    private Context contexts;
    private List<String> list;

    private static final String TAG = MainActivity.class.getSimpleName();

    private final static int REQUEST_CODE = 42;
    public static final int PERMISSION_CODE = 42042;


    private PDFView pdfView;

    private Uri uri;

    private Integer pageNumber = 0;
     private List<String> it;

    String pdfFileName;


    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //--------------  get num of pdf files from assets folder
        AssetManager assetManager = getAssets();
        String[] files = new String[0];
        try {
            files = assetManager.list("pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
        it = new LinkedList<String>(Arrays.asList(files));
        // System.out.println(it.size());
        for (int i = 0; i < it.size(); i++)
            Log.d("List of files .......", it.get(i).toString());


        // for encrypted pdf files
        viewPager = (ViewPager2) findViewById(R.id.pager);
        adapter = new PDF_FragmentAdapter(getSupportFragmentManager(),this.getLifecycle(),it); //pass pdf file name array
        viewPager.setOrientation(viewPager.ORIENTATION_HORIZONTAL);
        viewPager.setAdapter(adapter);
    }

}

这是我的 Pdf_FragmentAdapter.java


public class PDF_FragmentAdapter extends FragmentStateAdapter  {

    private List<String> List;

    SparseArray<Fragment> registeredFragments = new SparseArray<>();


    public PDF_FragmentAdapter( @NonNull FragmentManager fm, @NonNull Lifecycle lifecycle,  List<String> arrayList) {
        super(fm,lifecycle);
        this.List = arrayList;
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        Fragment pdf_fragment = newInstance(List.get(position));
        registeredFragments.put(position,pdf_fragment);
        return registeredFragments.get(position);
    }


    @Override
    public int getItemCount() {
        return List.size();
    } 
}

这是我的 PDF_Fragment.java


    public class PDF_Fragment extends Fragment {

    private PDFView pdfViewer;

    private View.OnScrollChangeListener onScrollChangeListener;
    private OnPageChangeListener onPageChangeListener;
    private Fragment fragment;
    private int pageNumber =0;
    private String pdfFileName;


    public static PDF_Fragment newInstance(String filename) {

        PDF_Fragment fragment = new PDF_Fragment();
        Bundle args = new Bundle();
        args.putString("someMessage", filename);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view =  inflater.inflate(R.layout.fragment_pdf, container, false);
        pdfFileName = getArguments().getString("someMessage");

        return view;
    }


    @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        PDFView pdfViewer = (PDFView) view.findViewById(R.id.pdfView);

        pdfViewer.fromAsset("pdf/" + pdfFileName)
                .load();

    }
}

这是我的片段 xml 布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PDF_Fragment">

        <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

This is an image of how my log looks like when i scroll the viewpager

【问题讨论】:

  • 遇到同样的问题 有人可以帮忙解决吗?
  • pdf 查看器非常大 - 您可以保留 1 个副本,而寻呼机/片段可以保存 pdf 详细信息。在每次页面更改时,您可以指示 pdf 查看器加载新的 pdf。

标签: android android-viewpager android-viewpager2 pdfview


【解决方案1】:

我遇到了完全相同的问题,当我滚动到另一个片段时,片段正在破坏。保留碎片

pager.offscreenPageLimit = 3 // The number of fragments which should be kept

-3, -2, -1, 当前, 1, 2, 3

如果设置为 3,则最大值。 viewpage 将在两侧保留 3 个片段

【讨论】:

  • 非常有用的答案。非常感谢。兄弟,你拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多