将列表视图中的项目保存到android中的文本文件中

时间:2015-04-15 02:43:36

标签: android android-listview text-files

我正在浏览来自外部usb存储的xml文件(使用otg cable,连接在tablet / android手机中)进行解析。

步骤:

  1. 从外部USB存储中浏览文件
  2. 解析xml文件
  3. 将文件保存在文本文件中
  4. 目前,我现在能够浏览并解析xml文件,然后显示已解析的文件,其中它在列表视图中显示所需的信息。现在,我想将显示的信息保存为文本文件,并将其保存到平板电脑的外部SD卡中。这是代码:

    Model.java:

    public class Model {
    String _model;
    String _part;
    String _sw;
    String _desc;
    
    // constructor
    public Model() { 
    }
    
    // constructor with parameters
    public Model(String model, String part, String sw, String desc) {
        this._model = model;
        this._part  = part;
        this._sw    = sw;
        this._desc  = desc;
    }
    
    // Set all methods
    public void setModel(String model) {
        this._model = model;
    }
    
    public void setPart(String part) {
        this._part = part;
    }
    
    public void setSw(String sw) {
        this._sw = sw;
    }
    
    public void setDesc(String desc) {
        this._desc = desc;
    }
    
    // Get all methods
    public String getModel() {
        return this._model;
    }
    
    public String getPart() {
        return this._part;
    }
    
    public String getSw() {
        return this._sw;
    }
    
    public String getDesc() {
        return this._desc;
    }
    
    //
    @Override
    public String toString() {
        return  "\n" + "Device" + "\n" + "\n"
                + "Model ID : " + _model + "\n" 
                + "Part Number : " + _part + "\n" 
                + "Software Version: " + _sw + "\n" 
                + "Description : " + _desc ;
    }
    }
    

    ModelParser.java:

    public class ModelParser extends DefaultHandler{
    static final String ERROR = "Errors";
    static final String ID = "ID";
    static final String PART = "PartNumber";
    static final String SW = "SoftwareVersion";
    static final String DESC = "Description";
    
    private boolean done = false;
    private String currentTag = null;
    private Model current = null;    
    private ArrayList<Model> model = new ArrayList<Model>();
    
    public ArrayList<Model> getItemsList() {
        return model;
    }
    
    public ArrayList<Model> parse(Context context) {        
        try {
            String file = ReadSystemActivity.getFilename();
            file.toString();
    
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            FileInputStream fis = new FileInputStream(file);
            parser.setInput(new InputStreamReader(fis));
    
            int eventType = parser.getEventType();
    
    
            while (eventType != XmlPullParser.END_DOCUMENT && !done) {
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    model = new ArrayList<Model>();
                    break;
                case XmlPullParser.START_TAG:
                    currentTag = parser.getName();
                        if (currentTag.equalsIgnoreCase(ERROR)) {
                            current = new Model(); 
                            }
    
                        else if (current != null) { 
                        if (currentTag.equalsIgnoreCase(ID)) {
                            current.setModel(parser.nextText());
                        } else if (currentTag.equalsIgnoreCase(PART)) {
                            current.setPart(parser.nextText());
                        } else if (currentTag.equalsIgnoreCase(SW)) {
                            current.setSw(parser.nextText());
                        }else if (currentTag.equalsIgnoreCase(DESC)) {
                            current.setDesc(parser.nextText());
                        }
    
    
                    }
    
                 break;
                 case XmlPullParser.END_TAG:
                currentTag = parser.getName();
                if (currentTag.equalsIgnoreCase(ERROR) && current != null) {
                    model.add(current);
                } else if (currentTag.equalsIgnoreCase(ERROR)) {
                    done = true;
                }
                break;
            }
            eventType = parser.next();
        }
    
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return model;
    }
    }
    

    和ReadActivity.java:

    public class ReadActivity extends ListActivity implements OnClickListener {
    
    public List<Model> model = null;
    private String filename = "SystemInfo.txt";
    
    String modd = modId.getModel();
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read);
    
        new LoadSystemTask().execute();
    
        Button save = (Button) findViewById(R.id.btnSave);
        save.setOnClickListener(new OnClickListener() {
    
        public void onClick(View v) {
            // write on SD card file data in the text box
            if (isSDCardWritable()) {
    
                  StringBuilder locationStrBuilder = new StringBuilder();
                  locationStrBuilder.append("Model ID: "+ modd);
                  String locationStr = locationStrBuilder.toString();
            try {
                File sdCard = Environment.getExternalStorageDirectory();
                File directory = new File(sdCard.getAbsolutePath()+"/FileReader");
                directory.mkdirs();
                File myFile = new File(directory, filename);
    
           myFile.createNewFile();
           FileOutputStream fOut = new FileOutputStream(myFile, true);
           OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
           myOutWriter.append(locationStr);
           myOutWriter.close();
           fOut.close();
           Toast.makeText(getBaseContext(),"Done writing to SD Card",Toast.LENGTH_SHORT).show();
          } 
          catch (Exception e) {
           Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
          } }
          else 
            {
                // SD Card Not Available
                Toast.makeText(getBaseContext(),"SD Card Not Available",Toast.LENGTH_SHORT).show();
            } //else
    
        }// onClick
        }); // btnSave
        }
    
        private class LoadSystemTask extends AsyncTask<String, Void, List<Model>> { 
    
        @Override
        protected List<Model> doInBackground(String... args) {
    
            // CALL XMLPULLPARSER & RETURN A LIST           
            ModelParser parser = new ModelParser();
            model = parser.parse(getBaseContext());
            return model;
        }
    
        @Override
        protected void onPostExecute(List<Model> models) {
    
            ArrayAdapter<Model> adapter = new ArrayAdapter<Model>(getBaseContext(), android.R.layout.simple_list_item_1, models);
    
            setListAdapter(adapter);
    
        }
    }
    
    
    
    public boolean isSDCardWritable() {
    String status = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(status)) 
    {
      return true;
    }
          return false;
    } //isSDCardWritable
    
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub  
    }
    }
    

    问题是,我想保存Id,但是当我点击保存按钮时,我在SystemInfo.txt中得到一个空值。

1 个答案:

答案 0 :(得分:0)

您将模型存储在另一个对象中并尝试从新对象中检索它。

这是您在ModelParser

中存储模型对象的位置
current = new GarminModel()

而您正试图从ReadActivity

中的新对象中检索它
GarminModel modId = new GarminModel();
String modd = modId.getModel();

通过调用ModelParser's内的getItemsList() ReadActivity来获取对模型arraylist的引用,并从中尝试获取模型对象


检查以下代码中以下两行的位置

 ModelParser parser = new ModelParser();

 ArrayList<Model> modelList = parser.getItemsList();
              Model modd = modelList.get(0);

请注意,您需要删除ModelParser解析器= new ModelParser();来自LoadSystemTask

public class ReadActivity extends ListActivity implements OnClickListener {

public List<Model> model = null;
private String filename = "SystemInfo.txt";
ModelParser parser = new ModelParser();
//-----------------

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_read);

    new LoadSystemTask().execute();

    Button save = (Button) findViewById(R.id.btnSave);
    save.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        // write on SD card file data in the text box
        if (isSDCardWritable()) {
              ArrayList<Model> modelList = parser.getItemsList();
              //-----
              Model modd = modelList.get(0);
              StringBuilder locationStrBuilder = new StringBuilder();
              locationStrBuilder.append("Model ID: "+ modd);
              String locationStr = locationStrBuilder.toString();
        try {
            File sdCard = Environment.getExternalStorageDirectory();
            File directory = new File(sdCard.getAbsolutePath()+"/FileReader");
            directory.mkdirs();
            File myFile = new File(directory, filename);

       myFile.createNewFile();
       FileOutputStream fOut = new FileOutputStream(myFile, true);
       OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
       myOutWriter.append(locationStr);
       myOutWriter.close();
       fOut.close();
       Toast.makeText(getBaseContext(),"Done writing to SD Card",Toast.LENGTH_SHORT).show();
      } 
      catch (Exception e) {
       Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
      } }
      else 
        {
            // SD Card Not Available
            Toast.makeText(getBaseContext(),"SD Card Not Available",Toast.LENGTH_SHORT).show();
        } //else

    }// onClick
    }); // btnSave
    }

    private class LoadSystemTask extends AsyncTask<String, Void, List<Model>> { 

    @Override
    protected List<Model> doInBackground(String... args) {

        // CALL XMLPULLPARSER & RETURN A LIST           

        model = parser.parse(getBaseContext());
        return model;
    }