Мой проект имеет проблемы с сохранением ArrayList <T>с SharedPreferences - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть проблема, которая сводит меня с ума.я знаю, как использовать «SharedPreferences» в Android, но я не знаю, где поместить его в моем проекте, например, onCreate (), onDestroy () или где-то еще.* Я хочу сохранить NoteLab.mNotes в NoteListFragment

* Note.java

package notes.com.example.alireza;
public class Note {
public UUID nId;
public Date nDate;
public String nTitle;
public String nDetails;

public Note(){
    nId = UUID.randomUUID();
    nDate = new Date();
}
public Date getnDate(){
    return nDate;
}
public UUID getnUUID(){
    return nId;
}

public String getnTitle() {
    return nTitle;
}

public void setnTitle(String nTitle) {
    this.nTitle = nTitle;
}

public String getnDetails() {
    return nDetails;
}

public void setnDetails(String nDetails) {
    this.nDetails = nDetails;
}
}

* NoteLab.java

package notes.com.example.alireza;
import android.content.Context;
import java.util.ArrayList;
import java.util.UUID;

class NoteLab {
public static ArrayList<Note> mNotes;
public static NoteLab noteLab;
public Context mAppContext;


private NoteLab(Context AppContext){
    mAppContext = AppContext;
    mNotes = new ArrayList<Note>();

}

public static NoteLab get(Context context){
    if (noteLab == null){
        noteLab = new NoteLab(context.getApplicationContext());
    }
    return noteLab;
}


public static ArrayList<Note> getNotes(){
    return mNotes;
}

public static Note getNote(UUID mId){
    for (Note n: mNotes){
        if (mId == n.getnUUID()){
            return n;
        }
    }
    return null;
}

}

* NoteListFragment.java

package notes.com.example.alireza;


public class NoteListFragment extends ListFragment {

Note note;
ArrayList<Note> notes;
public static Date date;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    notes = NoteLab.get(getActivity()).getNotes();
    myArrayAdapter arrayAdapter = new myArrayAdapter(notes);
    setListAdapter(arrayAdapter);

}

@Override
public void onStart() {
    super.onStart();
    View emptyView = getActivity().getLayoutInflater().inflate(R.layout.emptymainlist,null);
    ((ViewGroup)getListView().getParent()).addView(emptyView);
    getListView().setEmptyView(emptyView);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    int checked = 1;
    Note c = ((myArrayAdapter)getListAdapter()).getItem(position);
    Intent i = new Intent(getActivity(),NoteActivity.class);
    i.putExtra("id",c.getnUUID());
    i.putExtra(NoteListActivity.EXTRA_DATE,checked);
    startActivity(i);
}

    //custom arrayList
public class myArrayAdapter extends ArrayAdapter<Note> {
    public myArrayAdapter(ArrayList<Note> notes) {
        super(getActivity(), 0, notes);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = getActivity().getLayoutInflater().inflate(R.layout.notelistfragment_item, null);
        }
        Note n = getItem(position);
        date = n.getnDate();


        PersianCalendar persianCalendar = new PersianCalendar();
        persianCalendar.setTime(date);

        TextView titleTextView = convertView.findViewById(R.id.titleTextView);
        titleTextView.setText(n.getnTitle());

        TextView detailTextView = convertView.findViewById(R.id.detailsTextView);
        detailTextView.setText(n.getnDetails());

        TextView dateTextView = convertView.findViewById(R.id.dateTextView);
        dateTextView.setText(DateFormat.getDateInstance(DateFormat.FULL).format(date) + " : تاریخ ذخیره ");

        return convertView;
    }

}

@Override
public void onResume() {
    super.onResume();
    ((myArrayAdapter)getListAdapter()).notifyDataSetChanged();
}

Как вы понимаете из кодов, я хочу сохранить мой массив массивов mNotes, который помещен в NoteLab.java.there, также есть NoteListActivtiy.java, который поддерживает NoteListFragment, но я думаю, что это можно сделать в NoteListFragment.

благодаря stackoverflow и всем, кто пытается мне помочь.

1 Ответ

0 голосов
/ 07 декабря 2018

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

Где вы должны поместить свой код ??это зависит от вашего бизнеса (или требований).

Если вы хотите передать массив элементов во фрагмент или в другое действие, вы можете использовать Gson lib для преобразования его в строку, затем поместить его в пакет и передать этот пакет вчто вы хотите.Затем во фрагменте или упражнении вы также можете получить этот массив с помощью Gson.

Вот пример:

Gson gson = new Gson();
gson.toSring(yourData);

// then you can get the data by 
Gson gson = new Gson();
String data = yourBundle.getString("your_key");
yourDataModel = gson.fromJson(data, YourDataModel.class);

// it will work even with ArrayList
...