2015-03-14 4 views
1

Я пытаюсь сохранить все элементы в своем ListView в текстовый файл. Я делаю элемент, а затем сохраняю его при нажатии этой кнопки.Сохранить listview в txt файл

@Override 
public void onClick(View v) { 
    switch(v.getId()) { 

     case R.id.addItem: 

      items.add(new ListViewItem() {{ 

       ThumbnailResource = R.mipmap.ic_launcher; 
       Title = et.getText().toString(); 
       SubTitle = "Item2 Description"; 

      }}); 
      lv.setAdapter(adapter); 

      // add-write text into file 
      try { 
       fileout = openFileOutput("mytextfile.txt", MODE_PRIVATE); 
       outputWriter = new OutputStreamWriter(fileout); 
       outputWriter.write(et.getText().toString()); 
       outputWriter.close(); 

       //display file saved message 
       Toast.makeText(getBaseContext(), "File saved successfully!", 
         Toast.LENGTH_SHORT).show(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     break; 

После этого, когда человек выходит из приложения и возвращается обратно, этот код в процессе создания добавляет элемент списка назад.

try { 
     FileInputStream fileIn=openFileInput("mytextfile.txt"); 
     InputStreamReader InputRead= new InputStreamReader(fileIn); 

     char[] inputBuffer= new char[READ_BLOCK_SIZE]; 
     String start=""; 
     int charRead; 

     while ((charRead=InputRead.read(inputBuffer))>0) { 
      // char to string conversion 
      String readstring=String.copyValueOf(inputBuffer,0,charRead); 
      start +=readstring; 
     } 
     InputRead.close(); 
     final String finalStart = start; 
     items.add(new ListViewItem() {{ 

      ThumbnailResource = R.mipmap.ic_launcher; 
      Title = finalStart; 
      SubTitle = "Item2 Description"; 

     }}); 
     lv.setAdapter(adapter); 
     Toast.makeText(getBaseContext(), start,Toast.LENGTH_SHORT).show(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Проблема заключается в сохранении только одного элемента ListView за раз. не все из них, хотя они сохраняются после каждого нажатия кнопки. Как мне получить его, чтобы сохранить все его элементы в txt-файле. Не только самый последний?

Спасибо.

Вот весь мой код:

MainActivity:

public class MainActivity extends ActionBarActivity implements 
View.OnClickListener{ 

EditText et; 

Button bt; 

ListView lv; 

List<ListViewItem> items; 

CustomListViewAdapter adapter; 

FileOutputStream fileout; 

OutputStreamWriter outputWriter; 

static final int READ_BLOCK_SIZE = 100; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    et = (EditText) findViewById(R.id.editText); 
    bt = (Button) findViewById(R.id.addItem); 
    bt.setOnClickListener(this); 

    lv = (ListView) findViewById(R.id.listView); 
    items = new ArrayList<ListViewItem>(); 
    adapter = new CustomListViewAdapter(this, items); 

    try { 
     FileInputStream fileIn=openFileInput("mytextfile.txt"); 
     InputStreamReader InputRead= new InputStreamReader(fileIn); 

     char[] inputBuffer= new char[READ_BLOCK_SIZE]; 
     String start=""; 
     int charRead; 

     while ((charRead=InputRead.read(inputBuffer))>0) { 
      // char to string conversion 
      String readstring=String.copyValueOf(inputBuffer,0,charRead); 
      start +=readstring; 
     } 
     InputRead.close(); 
     final String finalStart = start; 
     items.add(new ListViewItem() {{ 

      ThumbnailResource = R.mipmap.ic_launcher; 
      Title = finalStart; 
      SubTitle = "Item2 Description"; 

     }}); 
     lv.setAdapter(adapter); 
     Toast.makeText(getBaseContext(), start,Toast.LENGTH_SHORT).show(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    lv.setOnItemLongClickListener(new ListView.OnItemLongClickListener() { 
     // setting onItemLongClickListener and passing the position to the function 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
             int position, long arg3) { 
      removeItemFromList(position); 

      return true; 
     } 
    }); 
} 

@Override 
public void onClick(View v) { 
    switch(v.getId()) { 

     case R.id.addItem: 

      items.add(new ListViewItem() {{ 

       ThumbnailResource = R.mipmap.ic_launcher; 
       Title = et.getText().toString(); 
       SubTitle = "Item2 Description"; 

      }}); 
      lv.setAdapter(adapter); 

      // add-write text into file 
      try { 
       fileout = openFileOutput("mytextfile.txt", MODE_PRIVATE); 
       outputWriter = new OutputStreamWriter(fileout); 
       outputWriter.write(et.getText().toString()); 
       outputWriter.close(); 

       //display file saved message 
       Toast.makeText(getBaseContext(), "File saved successfully!", 
         Toast.LENGTH_SHORT).show(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     break; 
    } 

} 

class ListViewItem { 

     public int ThumbnailResource; 
     public String Title; 
     public String SubTitle; 
} 

protected void removeItemFromList(int position) { 
    final int deletePosition = position; 

    AlertDialog.Builder alert = new AlertDialog.Builder(
      MainActivity.this); 

    alert.setTitle("Delete"); 
    alert.setMessage("Do you want delete this item?"); 
    alert.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TOD O Auto-generated method stub 

      // main code on after clicking yes 
      items.remove(deletePosition); 
      adapter.notifyDataSetChanged(); 
      adapter.notifyDataSetInvalidated(); 

     } 
    }); 
    alert.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      dialog.dismiss(); 
     } 
    }); 

    alert.show(); 

    } 
} 

CustomViewAdapter:

public class CustomListViewAdapter extends BaseAdapter { 

LayoutInflater inflater; 
List<MainActivity.ListViewItem> items; 

public CustomListViewAdapter(Activity context, List<MainActivity.ListViewItem> items) { 
    super(); 

    this.items = items; 
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    MainActivity.ListViewItem item = items.get(position); 

    View vi=convertView; 

    if(convertView==null) 
     vi = inflater.inflate(R.layout.item_row, null); 

    ImageView imgThumbnail = (ImageView) vi.findViewById(R.id.imgThumbnail); 

    TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle); 

    TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle); 

    imgThumbnail.setImageResource(item.ThumbnailResource); 

    txtTitle.setText(item.Title); 

    txtSubTitle.setText(item.SubTitle); 

    return vi; 
    } 
} 
+0

Почему вы сохраняете его в файле вместо сохранения его в ShredPrefernces? – yshahak

+0

В любом случае вы можете добавить метод в onStop() действия/фрагмента, который зацикливается на listView и сохраняет все данные. – yshahak

+0

Как добавить этот метод к onstop –

ответ

0

Положите его в OnStop:

@Override 
public void onStop(){ 
    super.onStop(); 
    SharedPreferences.Editor edit = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
    for (int i = 0 ; i < items.size(); i++) { 
     ListViewItem item = items.get(i); 
     edit.putString(Integer.toString(i), item.ThumbnailResource + "," + item.Title + "," + item.SubTitle); 
    } 
    edit.commit(); 

Чтобы извлечь эту надстройку данных somethi ng нравится этому onResume():

SharedPreferences myPref = PreferenceManager.getDefaultSharedPreferences(this); 
    String item = myPref.getString(Integer.toString(0), "empty"); 
    int i = 0; 
    do { 
     String[] result = item.split(","); 
     ListViewItem listItem = new ListViewItem(); 
     listItem.ThumbnailResource = Integer.valueOf(result[0]); 
     listItem.Title = result[1]; 
     listItem.SubTitle = result[2]; 
     items.add(listItem); 
     i++; 
     item = myPref.getString(Integer.toString(i), "empty"); 
    } while (!item.equals("empty")); 
+0

Я чувствую, что это сработает, но вы правы, щель заставила мое приложение принудительно закрыть его. Как мне разбить его, чтобы это не было heppen –

+0

Я его отредактировал, теперь он должен работать – yshahak

+0

большое вам спасибо –