【发布时间】: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