如何在recyclelerView上添加动态数据并保存数据?

时间:2017-01-14 02:08:20

标签: android

我想在用户输入编辑文本时保存数据。

它可以在recyclerView上显示,应用程序重新启动时应用程序可以再次显示它。

我尝试用户共享偏好,我可以让recyclerView在用户输入编辑文本时显示数据。

但是当我想保存数据并获取数据时,布局会让我的应用程序崩溃。

我发现崩溃代码是     String getUserInputBlood = preferences.getString(" uerInputBlood","");

我该如何解决?任何帮助都将不胜感激。

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_blood_sugar_report"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.huaweb_system.taiwanuniversityhome.BloodSugarReportActivity">

    <EditText
        android:id="@+id/editBloodSugar"
        android:text="543"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/sendBlood"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerBloodReport"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>


</LinearLayout>

活性:

public class BloodSugarReportActivity extends AppCompatActivity {

    private RecyclerView recyclerBloodReport;
    private BloodSugarReportAdapter myAdapter;
    private List<String> listData = new ArrayList<>();
    private EditText editBloodSugar;
    private Button sendBlood;
    private SharedPreferences preferences;
    private SharedPreferences.Editor editor;

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

        editBloodSugar = (EditText) findViewById(R.id.editBloodSugar);


        sendBlood=(Button)findViewById(R.id.sendBlood);
        sendBlood.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String uerInputBlood = editBloodSugar.getText().toString();
                preferences=getSharedPreferences("uerInputBlood",MODE_PRIVATE);
                editor=preferences.edit();
                editor.putString("uerInputBlood",uerInputBlood);
                editor.commit();
                //show user input edit text successful-------------
                listData.add(uerInputBlood);
            }
        });
        //i try to use getString to get it that i saved.-----------
        //it will crash
        String getUserInputBlood = preferences.getString("uerInputBlood", "");
        listData.add(getUserInputBlood);

        recyclerBloodReport = (RecyclerView) findViewById(R.id.recyclerBloodReport);
        recyclerBloodReport.setLayoutManager(new LinearLayoutManager(this));

        myAdapter=new BloodSugarReportAdapter(this,listData);
        recyclerBloodReport.setAdapter(myAdapter);
        myAdapter.notifyDataSetChanged();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //of course , it's not working from here
        String getUserInputBlood = preferences.getString("uerInputBlood", "");
        listData.add(getUserInputBlood);
    }
}

3 个答案:

答案 0 :(得分:2)

如果您有大量数据,则需要使用SQL。如果您想使用共享首选项,可以尝试:

private void saveBlood(){
    SharedPreferences preferences = getSharedPreferences("uerInputBlood", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    listData.clear();
    editor.putInt("count", listData.size());
    for(int i=0; i<listData.size(); i++){
        editor.putString("blood"+i, listData.get(i));
    }
    editor.commit();
}


private void restoreBlood(){
    listData.clear();
    SharedPreferences preferences = getSharedPreferences("uerInputBlood", MODE_PRIVATE);
    int tmpCount = preferences.getInt("count", 6);
    for(int i=0; i<tmpCount; i++){
        listData.add(preferences.getString("blood"+i, ""));
    }
}

希望有所帮助:)

答案 1 :(得分:0)

尝试将myAdapter.notifyDataSetChanged();移至onResume()的末尾。您在onCreate()中不需要它,因为您刚刚创建了该适配器,并且数据在之后没有发生变化。

此外,您无需在onCreate()onResume()中调用此部分。从onCreate()中删除它。您只需将相同的项目两次添加到列表中:

String getUserInputBlood = preferences.getString("uerInputBlood", "");  
 listData.add(getUserInputBlood);

SharedPreferences通常用于存储应用程序所需的一些键/值数据项。它们不用于存储列表。

如果您尝试存储所有列表值,则应使用其他形式的数据存储,例如:一个SQLite数据库。有关详细信息,请参阅storage options

答案 2 :(得分:0)

尝试使用 Sqlite 数据库

就您而言,在 SQLite 上执行此操作比共享首选项要容易得多。

看看这个https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase

很高兴为您提供帮助:-)