Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建java类的ArrayList的文件_Java_Android_File_Arraylist - Fatal编程技术网

创建java类的ArrayList的文件

创建java类的ArrayList的文件,java,android,file,arraylist,Java,Android,File,Arraylist,我正在制作一个Android应用程序,当某人生日的时候它会提醒我 我现在可以添加一个名字和相应的日期。 但是,我目前所做的是保存部分。我已经尝试寻找一些解决方案,但无法将其移植到我的需要。因为它是一个ArrayList而不是一个简单的字符串,所以无法序列化(如果我是正确的话?),因此无法保存。那么,有没有其他方法来保存此类数据 这是我的密码: Item.java: public class Item implements Serializable{ private String name;

我正在制作一个Android应用程序,当某人生日的时候它会提醒我

我现在可以添加一个名字和相应的日期。 但是,我目前所做的是保存部分。我已经尝试寻找一些解决方案,但无法将其移植到我的需要。因为它是一个ArrayList而不是一个简单的字符串,所以无法序列化(如果我是正确的话?),因此无法保存。那么,有没有其他方法来保存此类数据

这是我的密码:

Item.java:

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的列表,所以我想知道如何将其放入文件中。我编辑了我的答案,以证明它将以同样的方式工作。试试看。