2016-06-15 4 views
0

Я создал списокView, основанный на пользовательском вводе. Пользователь должен ввести текст в editText, а затем он будет добавлен в список. Он отлично работает. Мой вопрос, однако, заключается в том, как сохранить эти данные, поэтому, даже когда они закрывают приложение, а затем снова открывают его, у listView все еще есть элементы в нем с последнего раза? Вот мой код:Как сохранить данные в listView

MainActivity.java

package com.kass.planner2; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends Activity implements View.OnClickListener { 

    private Button btn; 
    private EditText et; 
    private ListView lv; 
    ArrayList<String> list = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 

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

     btn = (Button)findViewById(R.id.button); 
     btn.setOnClickListener(this); 
     et = (EditText)findViewById(R.id.editText); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, list); 

     // set the lv variable to your list in the xml 
     lv=(ListView)findViewById(R.id.listView); 
     lv.setAdapter(adapter); 
    } 
    public void onClick(View v) 
    { 
     String input = et.getText().toString(); 
     if(input.length() > 0) 
     { 
      // add string to the adapter, not the listview 
      adapter.add(input); 
      // no need to call adapter.notifyDataSetChanged(); as it is done by the adapter.add() method 
     } 
    } 


} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="com.kass.planner2.MainActivity" 
    android:weightSum="1"> 

    <RelativeLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" 
     android:layout_weight="1.12"> 

     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/editText" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="60dp" 
      android:layout_alignEnd="@+id/button" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="New Button" 
      android:id="@+id/button" 
      android:layout_centerVertical="true" 
      android:layout_alignParentStart="true" 
      android:onClick="saveEvent"/> 

     <ListView 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/listView" 
      android:layout_centerVertical="true" 
      android:layout_alignParentEnd="true" 
      android:layout_toEndOf="@+id/editText" /> 
    </RelativeLayout> 


</LinearLayout> 

Спасибо.

ответ

0

Вы можете использовать либо PreferenceManager, либо внутреннюю базу данных SQL для достижения своей задачи.

Вот пример того, как можно использовать внутреннюю базу данных SQL:

Android поставляется со встроенной базой данных SQLite. База данных нуждается в таблице, прежде чем она сможет хранить любой вход, называемый «InputTable». Создайте новую папку db в том же месте, что и MainActivity.java. Затем создайте новый класс InputContract с именем файла InputContract.java:

package com.example.db; 

import android.provider.BaseColumns; 

public class InputContract { 
public static final String DB_NAME = "com.example.db"; 
public static final int DB_VERSION = 1; 

public class TaskEntry implements BaseColumns { 
    public static final String TABLE = "tasks"; 

    public static final String COL_TASK_TITLE = "title"; 
    } 
} 

Класс InputContract определяет константы, которые используются для доступа к данным в базе данных. Для открытия базы данных вам также потребуется вспомогательный класс InputDbHelper. Создать этот класс в пакете дб и добавьте следующий код:

package com.example.db; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class InputDbHelper extends SQLiteOpenHelper { 

public InputDbHelper(Context context) { 
    super(context, InputContract.DB_NAME, null, InputContract.DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String createTable = "CREATE TABLE " + InputContract.TaskEntry.TABLE + " (" + 
      InputContract.TaskEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      InputContract.TaskEntry.COL_TASK_TITLE + " TEXT NOT NULL);"; 

    db.execSQL(createTable); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + InputContract.TaskEntry.TABLE); 
    onCreate(db); 
} 
} 

Теперь вам нужно адаптировать MainActivity для хранения данных в базе данных.

Добавить частный экземпляр InputDbHelper в классе MainActivity:

private InputDbHelper mHelper; 

Теперь вам нужно получить все данные из базы данных и показать его в главном окне.

Замените OnCreate на это:

btn = (Button)findViewById(R.id.button); 
btn.setOnClickListener(this); 
et = (EditText)findViewById(R.id.editText); 
lv=(ListView)findViewById(R.id.listView); 
mHelper = new InputDbHelper(this); 
updateUI(); 

внутри вашего на метод щелчка, добавьте следующий код:

String input = et.getText().toString(); 
    SQLiteDatabase db = mHelper.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(InputContract.TaskEntry.COL_TASK_TITLE, input);  
    db.insertWithOnConflict(InputContract.TaskEntry.TABLE, null, values, SQLiteDatabase.CONFICT_REPLACE);           
    db.close(); 
    updateUI(); 

Затем добавьте следующий метод MainActivity для обновления пользовательского интерфейса:

private void updateUI() { 

ArrayList<String> taskList = new ArrayList<>(); 
SQLiteDatabase db = mHelper.getReadableDatabase(); 
Cursor cursor = db.query(InputContract.TaskEntry.TABLE, 
     new String[]{InputContract.TaskEntry._ID, InputContract.TaskEntry.COL_TASK_TITLE}, 
     null, null, null, null, null); 
while (cursor.moveToNext()) { 
    int idx = cursor.getColumnIndex(InputContract.TaskEntry.COL_TASK_TITLE); 
    taskList.add(cursor.getString(idx)); 
} 

if (adapter== null) { 
    adapter= new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, 
      taskList); 
    lv.setAdapter(adapter); 
} else { 
    adapter.clear(); 
    adapter.addAll(taskList); 
    adapter.notifyDataSetChanged(); 
} 

cursor.close(); 
db.close(); 
} 

Теперь, даже после полной перезагрузки телефона, информация в списке будет r Emain.

Сложение:

Если вы когда-либо хотите удалить что-либо из базы данных, добавьте следующий метод:

public void deleteTask() { 
SQLiteDatabase db = mHelper.getWritableDatabase(); 
db.delete(InputContract.TaskEntry.TABLE, 
     InputContract.TaskEntry.COL_TASK_TITLE + " = ?", 
     new String[]{"Name of entry you want deleted"}); 
db.close(); 
updateUI(); 

}

+0

Вы не должны использовать адаптер массива в то время как «SimpleCursorAdapter» легко выполняет эту работу. Его в основном больше кода и, вероятно, больше времени выполнения. Хорошее объяснение иначе. –

1

Listview, как следует из названия, является View, который может отображать данные. Это фактически не сохраняет данные. Чтобы сохранить данные, вам необходимо использовать базу данных или SharedPreferences. Обычно общие настройки используются для сохранения быстрых настроек приложения.
Чтобы сохранить данные, вам необходимо использовать базу данных SQLite, присутствующую в каждом устройстве Android. Это делается с использованием SQLiteDatabase и SQLiteOpenHelper классов в Android.
Чтобы привязать данные к представлению, подобному ListView, который отображает сразу несколько строк данных, вам необходимо использовать адаптер. A SimpleCursorAdapter класс делает эту работу легко.
Здесь вы можете найти учебник для привязки данных к элементам управления, например TextViewhere. Это даст вам представление о том, как настроить базу данных на вашем устройстве.
После того, как вы это сделали, вы можете прочитать о SimpleCursorAdapterhere.

1

Учитывая вы все еще учусь, я предлагаю вам начать с используя методы SQLite. http://www.tutorialspoint.com/android/android_sqlite_database.htm

Для более быстрого и чистой реализации вы могли бы использовать ORM, как SugarORM: http://satyan.github.io/sugar/

Они имеют просто следовать командам, которые могут быть использованы для простых баз данных сборки и извлечения данных из них.

+0

Конструктор запросов - это действительно хорошая вещь! Я должен признать, что управляющая БД - это беспокойная и скучная задача для Android. –

+0

Я сам использую ORM для своей профессиональной работы. Царство еще одно хорошее. –

+1

Проверьте JDXA ORM. Простой, неинтрузивный и гибкий. Не нужно загромождать исходный код комментариями; нет необходимости наследовать от базового класса; нет необходимости генерировать исходный код. Вот некоторые фрагменты кода JDXA: http://softwaretree.com/v1/products/jdxa/code-snippets.html –

0

Если вы не хотите использовать базу данных, здесь есть уловка, которая может помочь вам с помощью обработки с небольшим количеством логики

public void writeData(String data)  // to writeData to file 
{ 
String fileName="listData.txt"; 
try { 
     FileOutputStream fileout=openFileOutput(fileName, MODE_APPEND); 
     OutputStreamWriter outputWriter=new OutputStreamWriter(fileout); 
     outputWriter.write(data); 
     outputWriter.close(); 



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

public String readFile() 
{ 
String fileName="listData.txt"; 
String line,data=""; 

try { 
     FileInputStream fIn = openFileInput (fileName) ; 
     InputStreamReader isr = new InputStreamReader (fIn) ; 
     BufferedReader br = new BufferedReader (isr) ; 

     while((line=br.readLine())!=null) 
     { 
     data=data+line; 
     } 

     isr.close () ; 
    } catch (IOException ioe) { 
     ioe.printStackTrace () ; 
    } 

    return data; 
} 

Здесь файл являются методы, чтобы вызвать

public void storeData()  // call this in the onclick 
{ 
String res=""; 

res= res + editText().getText().toString() + "\n"; // used \n as  delimiter 

writeData(res); 

} 

Теперь вот трюк. В OnCreate, вызовите метод splitIntoList(), перед созданием arrayadapter

public void splitIntoList() 
{ 
String result=readFile(); 

//Here is a little logic 

StringTokenizer st=new StringTokenizer(result,"\n"); 
while(st.hasMoreTokens()) 
{ 
     list.add(st.nextToken()); 
} 
} 

Пожалуйста, проверьте наличие ошибок, потому что я не побежал этот код на IDE

Смежные вопросы