2017-06-19 23 views
0

我试图从一个活动(其中用户可以放入两个不同的值,一个字符串值和一个整数值)从列表视图中保存两个值另一项活动。在第一个活动,它显示了一个疗程的列表和点的该课程在一个列表视图量,像这样:从其他活动(有两个值)永久保存到列表视图

课程:英语
积分:4

现在的问题是,每次我想使用add_course_actitivty输入另一个值,它会覆盖以前的值。我研究过不同的解决方案,比如使用sharedpreferences(Add items to listview from other activity),但是这只使用一个值,如果我尝试使用sharedpreferences,它会覆盖sharedpreferences中的其他值,但我希望用户添加多个课程和相应的点。同样在重新启动时,它会删除列表视图中的值(我为了避免这种情况需要将其存储在sharedpreferences中,但这不起作用,我不需要它)

KeuzeActivity.class(显示列表视图):

public class KeuzeActivity extends AppCompatActivity { 
    private FloatingActionButton fab_add; 
    private String student_naam; 
    private ListView keuze_list; 
    boolean wantDelete; 
    private ArrayAdapter adapter; 
    private String vak; 
    private int ec; 

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

     // setting title 
     student_naam = getIntent().getStringExtra("student"); 
     setTitle("Keuzevakken en projecten van " + student_naam); 


     //initialzing elements 
     fab_add = (FloatingActionButton)findViewById(R.id.fab_add); 
     keuze_list = (ListView) findViewById(R.id.keuze_list); 

     //initializing list 
     final ArrayList<Course> courseItems = new ArrayList<Course>(); 
     adapter = new ArrayAdapter<Course>(this, android.R.layout.simple_list_item_1, courseItems); 
     keuze_list.setAdapter(adapter); 


     // checks if intent has required values, put it in listview 
     if (getIntent().hasExtra("vak") && getIntent().hasExtra("ec")) { 
      vak = getIntent().getStringExtra("vak"); 
      ec = getIntent().getIntExtra("ec", ec); 
      courseItems.add(new Course(vak, ec)); 
      adapter.notifyDataSetChanged(); 
     } 


     // make fab go to other activity 
     fab_add.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(KeuzeActivity.this, add_course_activity.class)); 
      } 
     }); 


     // long press deletes item 
     keuze_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       showDeleteDialog(); 
       if (wantDelete) { 
        courseItems.remove(position); 
        adapter.notifyDataSetChanged(); 

       } 
       return true; 

      } 
     }); 

    } 



    private void showDeleteDialog() { 
     AlertDialog.Builder infobuilder = new AlertDialog.Builder(this); 
     infobuilder.setCancelable(false); 
     infobuilder.setTitle("Vak/project verwijderen"); 
     infobuilder.setMessage("Weet je zeker dat je het vak of project wilt verwijderen?"); 
     final TextView text = new TextView(this); 
     // action when pressed OK 
     infobuilder.setPositiveButton("Ja", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       wantDelete = true; 
       dialog.cancel(); 
      } 
     }); 

     infobuilder.setNegativeButton("Nee", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       wantDelete = false; 
       dialog.cancel(); 
      } 
     }); 
     infobuilder.show(); 

    } 

} 

add_course_activity.class(让我们用户输入过程和分)

public class add_course_activity extends AppCompatActivity { 
    private EditText course_edit; 
    private EditText ec_edit; 
    private Button save_btn; 
    private String student_name; 
    private int ec; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_course); 
     setTitle("Voeg vak of project toe"); 
     final Context context = getApplicationContext(); 

     // initializing elements 
     course_edit = (EditText) findViewById(R.id.edit_vak); 
     ec_edit = (EditText) findViewById(R.id.edit_ec); 
     save_btn = (Button) findViewById(R.id.save_button); 



     // action on savebutton 
     save_btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (course_edit.getText().toString().trim().length() > 0 && ec_edit.getText().toString().trim().length() > 0) { 
        ec = Integer.parseInt(ec_edit.getText().toString()); 
        Intent goBack = new Intent(add_course_activity.this, KeuzeActivity.class); 
        goBack.putExtra("vak", course_edit.getText().toString()); 
        goBack.putExtra("ec", ec); 
        goBack.putExtra("student", PreferenceManager.getDefaultSharedPreferences(context).getString("student_name", student_name)); 
        startActivity(goBack); 
       } 
       else { 
        Toast.makeText(context, "Voer juiste informatie in!", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 

Course.java类(getter和setter +与toString方法)

public class Course { 
    private String vak; 
    private int ec; 

    public Course(String vak, int ec) { 
     this.vak = vak; 
     this.ec = ec; 
    } 

    public String getVak() { 
     return vak; 
    } 

    public void setVak(String vak) { 
     this.vak = vak; 
    } 

    public int getEc() { 
     return ec; 
    } 

    public void setEc(int ec) { 
     this.ec = ec; 
    } 

    @Override 
    public String toString() { 
     return ("Vak: " + vak + "\n" + "Punten: " + ec); 
    } 
} 

请注意,我的代码不干净或完成,但要获得进一步我需要解决此问题。

+0

让我明白这个道理,所以基本上,当用户访问添加过程,并增加了一门课程,这将其添加到列表视图(无覆盖),但是当他关闭和打开的应用程序,它被重置为最后一道菜只有没有以前的? –

+0

这是它的工作原理 - >用户打开KeuzeActivity,它看到与课程和点的列表 - >用户要添加新的课程,所以点击晶圆厂晶圆厂打开add_activity_course - >用户可以把课程名称和点 - >保存它显示KeuzeActivity.java中的课程 - >用户关闭应用程序,重新打开它,一切都消失了。 – bramulous

+0

所以你没有后退按钮,是否正确? –

回答

0

你有几种方式来做到这一点。正如其他答复所建议的,您可以使用SQLLite数据库并将数据添加到课程表并从中检索数据。

如果您发现Db的方法复杂/重

你也可以使用你需要做的是图的方式来存储表示当然列表的字符串什么SharedPreferences。这不是最好的方式来处理它,但它会工作。

比方说,你选择用“VAC-EC”

序列化的课程对象然后你只需存储过程的序列化列表。示例“vac1-ec1,vac2-ec2”

当您需要添加一门课程时,您将抓住之前的字符串将其拆分为列表,将新课程附加到列表中并将列表重新序列化为要编码的字符串它。

其他的解决办法是使用领域。

+0

但是,如何在不覆盖存储在标签中的值的情况下如何添加到sharedpreferences?因为如果我是对的,你可以在键名下保存一个值,比如“course”。如果我调用函数.getString(“course”),它会给出一定的值。但是当我调用函数SharedPreferenceManager.putString(“course”,coursename)时,它将覆盖保存在标签中的前一个值。 – bramulous

+0

这个想法是在保存之前得到它的值。您从共享首选项中获取字符串,然后将其保存回来 –

0

你应该使用SQLiteDatabase并创建有效属性表和SQLite中储存的记录插入新的价值观融入其中

0

尝试,并得到它,当你想展示。

通过这个,你可以追踪所有添加的项目。你可以展示你想要的物品。

0

好吧,现在事情更清楚了。正如@Dwijraj回答的那样,当存储可能会有大量数据的数据时,为了最大限度地控制,最好使用SQLite。 您可以在此处详细了解不同数据保存方法: https://developer.android.com/training/basics/data-storage/index.html

SharedPreferences最好用来存储少量的信息,如存储应用的设置。例如[静音]。或者在比赛中获得高分。

对于存储您可能操作的大量数据,数据库是一个更好的选择。

您的数据结构可以是这样的:包含Unique_ID,课程名称,课程级别,课程摘要的课程表。 英文表格,其中将包含 考试,分数,持续时间。

有很多事情可以做。

+0

好吧,我会看看那个。谢谢您的帮助!如果我解决了我的问题,我会更新这篇文章。 – bramulous

相关问题