创建java类的ArrayList的文件
我正在制作一个Android应用程序,当某人生日的时候它会提醒我 我现在可以添加一个名字和相应的日期。 但是,我目前所做的是保存部分。我已经尝试寻找一些解决方案,但无法将其移植到我的需要。因为它是一个ArrayList而不是一个简单的字符串,所以无法序列化(如果我是正确的话?),因此无法保存。那么,有没有其他方法来保存此类数据 这是我的密码: Item.java:创建java类的ArrayList的文件,java,android,file,arraylist,Java,Android,File,Arraylist,我正在制作一个Android应用程序,当某人生日的时候它会提醒我 我现在可以添加一个名字和相应的日期。 但是,我目前所做的是保存部分。我已经尝试寻找一些解决方案,但无法将其移植到我的需要。因为它是一个ArrayList而不是一个简单的字符串,所以无法序列化(如果我是正确的话?),因此无法保存。那么,有没有其他方法来保存此类数据 这是我的密码: Item.java: public class Item implements Serializable{ private String name;
public class Item implements Serializable{
private String name;
private String date;
public Item(String name, String date){
this.name = name;
this.date = date;
}
public String getName(){
return name;
}
public String getDate(){
return date;
}
public void setName(String name){
this.name = name;
}
public void setDate(String date){
this.date = date;
}
}
MainActivity.java:
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
static RecyclerviewAdapter adapter;
static ArrayList<Item> itemList = new ArrayList<>();
private static String nameText;
private static String birthString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(llm);
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter = new RecyclerviewAdapter(itemList);
recyclerView.setAdapter(adapter);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AddBirthday();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
month++;
birthString = day + "-" + month + "-" + year;
itemList.add(new Item(nameText, birthString));
adapter.notifyDataSetChanged();
saveArrayList(getContext(), itemList);
}
}
private void AddBirthday() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Name");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
nameText = input.getText().toString();
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
public static void saveArrayList(Context c, ArrayList<Item> arrayList) {
}
}
public类MainActivity扩展了AppCompatActivity{
回收视图回收视图;
静态循环水适配器;
静态ArrayList itemList=新建ArrayList();
私有静态字符串nameText;
私有静态字符串;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
LinearLayoutManager llm=新的LinearLayoutManager(本);
llm.设置方向(线性布局管理器.垂直);
recyclerView.setLayoutManager(llm);
setItemAnimator(新的DefaultItemAnimator());
适配器=新的RecycleServiceAdapter(项目列表);
recyclerView.setAdapter(适配器);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
添加生日();
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共静态类DatePickerFragment扩展了DialogFragment
实现DatePickerDialog.OnDateSetListener{
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
//使用当前日期作为选择器中的默认日期
最终日历c=Calendar.getInstance();
int year=c.get(日历年);
int month=c.get(日历月);
int day=c.get(日历日期,每月的第天);
//创建DatePickerDialog的新实例并返回它
返回新的DatePickerDialog(getActivity(),this,year,month,day);
}
公共void onDateSet(日期选择器视图、整数年、整数月、整数天){
//对用户选择的日期执行某些操作
月份++;
生日字符串=日+“-”+月+“-”+年;
添加(新项目(nameText,birthString));
adapter.notifyDataSetChanged();
saveArrayList(getContext(),itemList);
}
}
私人生日{
AlertDialog.Builder=新建AlertDialog.Builder(此);
建造商名称(“名称”);
最终编辑文本输入=新编辑文本(本);
input.setInputType(InputType.TYPE\u CLASS\u TEXT);
builder.setView(输入);
setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
nameText=input.getText().toString();
DialogFragment newFragment=newDatePickerFragment();
show(getSupportFragmentManager(),“datePicker”);
}
});
setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
}
});
builder.show();
}
公共静态void saveArrayList(上下文c,ArrayList ArrayList){
}
}
在Java中序列化或反序列化ArrayList没有问题:
List<Item> list = new ArrayList<>();
list.add(new Item("A", "2006"));
list.add(new Item("B", "2016"));
// Serialize
FileOutputStream fos = context.openFileOutput("list.ser", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(list);
os.close();
fos.close();
// Deserialize
FileInputStream fileIn = context.openFileInput("list.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
list = (List<Item>) in.readObject();
in.close();
fileIn.close();
// Implement toString() in Item
System.out.println(list);
List List=new ArrayList();
增加(新项目(“A”、“2006”);
增加(新项目(“B”、“2016”);
//连载
FileOutputStream fos=context.openFileOutput(“list.ser”,context.MODE\u PRIVATE);
ObjectOutputStream os=新的ObjectOutputStream(fos);
os.writeObject(列表);
os.close();
fos.close();
//反序列化
FileInputStream fileIn=context.openFileInput(“list.ser”);
ObjectInputStream in=新的ObjectInputStream(fileIn);
list=.readObject()中的(list);
in.close();
fileIn.close();
//在项目中实现toString()
系统输出打印项次(列表);
请说明您查找的保存选项,以及它们如何不适合您的需要。否则这听起来“太宽泛了”。ArrayList
是一个可序列化的类。我尝试过使用共享首选项来实现它,但读到这样做效率不高。然后我尝试使用文件输出,但没有真正了解如何将其与ArrayList一起使用。我提供了足够的信息吗?我真的很想知道怎么做,但这是一个字符串列表,我使用的是object Item.java的列表,所以我想知道如何将其放入文件中。我编辑了我的答案,以证明它将以同样的方式工作。试试看。