Android 选择文件并加载数据到界面

1.跳转到选择文件界面

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                                intent.setType("*/*");
                                intent.addCategory(Intent.CATEGORY_OPENABLE);
                                startActivityForResult(intent, 1);

2.重写选择文件后的回调(这里只读excel文件)

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 1) {
                String path;
                Uri uri = data.getData();
                if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
                    path = uri.getPath();
//                    Toast.makeText(this, path , Toast.LENGTH_SHORT).show();
                    return;
                }
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
                    path = Util.getPath(this, uri);
//                    Toast.makeText(this, path, Toast.LENGTH_SHORT).show();
                } else {//4.4以下下系统调用方法
                    path =  Util.getRealPathFromURI(uri,TagSearchActivity.this);
//                    Toast.makeText(VisitorInfoAddActivity.this, path , Toast.LENGTH_SHORT).show();
                }
                if(path==null||path.isEmpty()||!path.endsWith("xls") ){
                    Toast.makeText(TagSearchActivity.this,"请选择Excel文件",Toast.LENGTH_SHORT);
                    return;
                }else{
                    epcList=new ArrayList<>();
                    tagAdapter.reSet(epcList);
                    //开Task读文件
                    String[] args=new String[1];
                    args[0]=path;
                    frt=new FileReaderTask();
                    frt.execute(args);
                }
            }
        }
    }

3.编写FileReaderTask内部类读取文件

class FileReaderTask extends AsyncTask<String, Integer, List<String>> {

        private static final int SUCESS = 0;    //成功
        private static final int FAIL = -1;   //文件打开失败
        private static final int File_TYPE_OTHER =-1; //XLS 文件
        private static final int File_TYPE_XLS =1; //XLS 文件
        private static final int File_TYPE_XLSX =2; //XLSx 文件
        private int status=SUCESS;               //当前状态,执行过程中随时更新
        private String msg="";               //错误信息
        StringBuilder warnInfo=new StringBuilder() ;               //提示信息
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loadingDialog.show();
            isReading=true;
        }
        @Override
        protected List<String> doInBackground(String... paths) {
            List<String> ret=new ArrayList<>();
            int fileType=File_TYPE_OTHER;   //当前文件类型
            try {
                Workbook workbook = Workbook.getWorkbook(new File(paths[0]));
                Sheet rs = workbook.getSheet(0);
                int rowsCount = rs.getRows();//总行数
                for (int r = 0; r < rowsCount; r++) {
                    Cell c = rs.getCell(0, r);
                    String epc = c.getContents();
                    if(epc.equals("")){
                        continue;
                    }
                    if(ret.contains(epc)){
                        warnInfo.append("已合并多条数据:"+epc+"\n");
                        continue;
                    }
                    ret.add(epc);
                }
                return ret;


            }catch(BiffException e){
                status=FAIL;
                msg="仅支持97-03  xls格式的Excel";
                return new ArrayList<>();
            }catch (Exception e){
                status=FAIL;
                msg=e.getMessage();
                return new ArrayList<>();
            }finally{
//                if(stream!=null)try{stream.close();}catch(Exception e){}
            }
        }
        @Override
        protected void onCancelled(List<String> visitors) {

        }


        @Override
        protected void onPostExecute(List<String> ret) {
            if(loadingDialog.isShowing()){
                loadingDialog.dismiss();
            }
            isReading=false;
            if(isCancelled()==false) {
                if (status != SUCESS) { //处理失败
                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
                } else {
                    epcList=ret;
                    tagAdapter.reSet(epcList);
                    if (warnInfo.length() > 0) {
                        showWarn(warnInfo.toString());
                    }
                }
            }
        }
    };

4.在手机默认自动旋转模式下,从文件中读取数据并加载到页面后,横置手机后,页面也横置了,然后数据消失了。只需在AndroidManifest.xml添加如下代码可解决
Android 选择文件并加载数据到界面_第1张图片
为什么会出现这种情况呢?
页面横置后,Android会默认重新调用Activity的onCreate方法,如果你的onCreate方法里修改了tagList集合,就会出现横置页面后,数据丢失的现象了,代码

android:windowSoftInputMode="adjustResize|stateHidden"

就是控制页面横置后不重新调用onCreate方法
参考:Android 设定横屏,禁止屏幕旋转,Activity重置
https://blog.csdn.net/u012364372/article/details/51088831/

你可能感兴趣的:(Android)