Android實戰 題庫(Pdf文件下載、顯示)

前言:真的沒什麼想寫的功能,佔個功能,套路一下吧。

效果圖:

 

涉及pdfView

  /**pdfView**/
    implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

這裏吧 我也想用WebView,但是帶有.pdf的Url ios可以直接顯示,但是不能直接顯示,還還有改動一下服務器的,用pdfView 雖然好用,如果真的正式發佈的他有個缺點,到處apk 會變大。也想找能直接通過url顯示pdf的,最後我還是用了老方式,下載之後顯示。

涉及知識點,ListView 適配、監聽,動態申請讀寫權限,下載pdf文件,顯示pdf,我又覺得下載的過程中,空白頁面不太好,做了個動畫。

通過雲數據庫存儲數據,將pdf文件上傳到數據庫。題庫顯示界面通過ListView適配所有數據,點擊item跳轉PdfViewActivity界面,傳遞數據參數,通過Okgo下載在線pdf文件,下載過程中有動畫顯示,下載完成隱藏動畫,通過PdfView顯示pdf文件。

public class QuestionBankFragment extends BaseFragment {
    @BindView(R.id.list_object)
    ListView sujectListView;
    List<Subject> mSubjectList = new ArrayList<>();
    SubjectAdapter mSubjectAdapter;

    public static Fragment getInstance() {
        Fragment fragment = new QuestionBankFragment();
        return fragment;
    }


    @Override
    protected int contentViewID() {
        return R.layout.fragment_question_bank;
    }

    @Override
    protected void initialize() {
        querySubject();
        OnItemClick();
    }

    private void OnItemClick() {
        sujectListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (mSubjectList == null){
                    return;
                }
                Subject subject = mSubjectList.get(i);
                Bundle bundle = new Bundle();
                bundle.putSerializable("subject",subject);
                startActivity(PdfViewActivity.class, bundle);
            }
        });
    }

    private void querySubject() {
        BmobQuery<Subject> subjectBmobQuery = new BmobQuery<Subject>();
        subjectBmobQuery.findObjects(new FindListener<Subject>() {
            @Override
            public void done(List<Subject> object, BmobException e) {
                if (e == null) {
                    mSubjectList = object;
                    mSubjectAdapter = new SubjectAdapter(getContext(),R.layout.item_subject, mSubjectList);
                    sujectListView.setAdapter(mSubjectAdapter);
                } else {
                    ToastUtils.showShort(getContext(), getContext().getString(R.string.query_failure));
                }
            }
        });
    }
    
}
public class SubjectAdapter extends ArrayAdapter<Subject> {
    private int resourceId;

    public SubjectAdapter(@NonNull Context context, int resource, @NonNull List<Subject> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Subject subject = getItem(position);
        SubjectViewHolder viewHolder;
        View view;
        if (convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId, null);
            viewHolder = new SubjectViewHolder();
            viewHolder.titleSuject = view.findViewById(R.id.title_subject);
            viewHolder.rescSuject = view.findViewById(R.id.subject_desc);
            viewHolder.imgSubject = view.findViewById(R.id.img_subject);
            view.setTag(viewHolder);
        }else {
            view = convertView;
            viewHolder = (SubjectViewHolder) view.getTag();
        }
        viewHolder.titleSuject.setText(subject.getTitle());
        viewHolder.rescSuject.setText(subject.getDesc());
        viewHolder.imgSubject.setImageURI(subject.getImages().getFileUrl());
        return view;
    }

    class SubjectViewHolder {
        TextView titleSuject;
        TextView rescSuject;
        SimpleDraweeView imgSubject ;
    }
}

PdfViewActivity.java

public class PdfViewActivity extends BaseActivity {
    public static final String TAG = "PdfViewActivity";
    @BindView(R.id.pdfView)
    PDFView mPDFView;
    @BindView(R.id.img_pgbar)
    ImageView imgPgbar;
    private AnimationDrawable ad;
    private static int REQUEST_CODE_CONTACT = 101;
    private Subject subject;
    OkGo mOkGo = OkGo.getInstance();
    String[] permissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

    @Override
    protected int contentViewID() {
        return R.layout.activity_pdf_view;
    }

    @Override
    protected void initialize() {
        setLeftBtnFinish();
        ad = (AnimationDrawable) imgPgbar.getDrawable();
        imgPgbar.postDelayed(new Runnable() {
            @Override
            public void run() {
                ad.start();
            }
        }, 100);

        Intent intent = getIntent();
        subject = (Subject) intent.getSerializableExtra("subject");
        setTopTitle(subject.getTitle(), true);

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_CONTACT);
            }
        }
        showPdfView(subject);

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_CONTACT) {
            for (int i = 0; i < permissions.length; i++) {
                Log.i(TAG, "申請的權限爲:" + permissions[i] + ",申請結果:" + grantResults[i]);
            }
            showPdfView(subject);
        }
    }

    private void showPdfView(Subject subject) {
        if (subject == null){
            return;
        }
        try {
            final File file = new File(Environment.getExternalStorageDirectory() + File.separator + subject.getTitle());
            if (!file.exists()) {
                file.mkdirs();
            }
            String target = Environment.getExternalStorageDirectory() + File.separator + subject.getDesc() + ".pdf";
            mOkGo.<File>get(subject.getPdfUrl().getFileUrl())
                    .execute(new FileCallback(target, subject.getDesc()) {

                        @Override
                        public void onSuccess(Response<File> response) {
                            LogUtils.d(TAG, "報告下載成功..." + response.body());
                            try {
                                mPDFView.fromFile(response.body())
                                        .defaultPage(0)//默認展示第一頁
                                        .load();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onFinish() {
                            super.onFinish();
                            imgPgbar.setVisibility(View.GONE);
                        }

                        @Override
                        public void onError(Response<File> response) {
                            super.onError(response);
                            LogUtils.e("下載失敗", response.message());
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mOkGo.cancelTag(this);
    }
}
<?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"
    android:orientation="vertical"
    android:background="@color/color_ffffff"
    tools:context=".activity.PdfViewActivity">

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

    <ImageView
        android:id="@+id/img_pgbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
        android:src="@drawable/amin_pgbar"/>

</FrameLayout>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章