RecyclerView将元素保存为JSON

编程入门 行业动态 更新时间:2024-10-23 04:59:20
本文介绍了RecyclerView将元素保存为JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有recyclerview(在片段中)和带有详细信息的片段到元素之一.一切都很好,但是保存我的数据时.我的JSON文件中结果不好.每当我打开列表的元素时,他都会在JSON文件中添加新元素,而他必须覆盖自己.

I have recyclerview (in fragment) and fragment with details information to one of the element. All is good, but when my data was saved. I have bad results in my JSON file. All times when i open element of list he add new element inside JSON file, while he must overwrite oneself.

我的活动

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.start_page_activity); Log.i("MainActivity", "onCreate"); if(savedInstanceState==null) { getFragment(new ObjectListFragment()); } } public void getFragment(Fragment fragment) { FragmentManager fm = getSupportFragmentManager(); Fragment mFragment = fm.findFragmentById(R.id.fragment_container); if (mFragment == null) { mFragment = fragment; fm.beginTransaction() .add(R.id.fragment_container, mFragment) mit(); } if (mFragment != null) { mFragment = fragment; fm.beginTransaction().addToBackStack(null) .replace(R.id.fragment_container, mFragment) mit(); } } }

我的模特:

public class Object { private static final String JSON_ID = "id"; private static final String JSON_TITLE = "title"; private UUID mId; private String mTitle; public Object() { mId=UUID.randomUUID(); } public Object(JSONObject json) throws JSONException { mId = UUID.fromString(json.getString(JSON_ID)); mTitle = json.getString(JSON_TITLE); } public JSONObject toJSON()throws JSONException{ JSONObject json = new JSONObject(); json.put(JSON_ID, mId.toString()); json.put(JSON_TITLE, mTitle); return json; } public UUID getId() { return mId; } public String getTitle() { return mTitle; } public void setTitle(String title) { mTitle = title; } @Override public String toString() { return mTitle; } }

ObjectLab:

ObjectLab:

public class ObjectLab { private static final String TAG = "ObjectLab"; private static final String FILENAME = "reminder.json"; private ObjectJSON mSerializer; private ArrayList<Object> mObjects; private static ObjectLab sObjectLab; private Context mContext; private ObjectLab(Context context){ mContext = context; mSerializer = new ObjectJSON(mContext, FILENAME); try { mObjects = mSerializer.loadReminders(); } catch (Exception e) { mObjects = new ArrayList<Object>(); Log.e(TAG, "Error loading crimes: ", e); } } public static ObjectLab get(Context c){ if(sObjectLab == null){ sObjectLab = new ObjectLab(c.getApplicationContext()); } return sObjectLab; } public ArrayList<Object> getObjects(){ return mObjects; } public Object getReminder(UUID id){ for(Object c : mObjects){ if(c.getId().equals(id)) return c; } return null; } public void addReminder(Object c){ mObjects.add(0,c); } public void deleteReminder(Object c){ mObjects.remove(c); } public boolean saveReminders(){ try{ mSerializer.saveReminders(mObjects); Log.d(TAG, "reminders saved to file"); return true; }catch (Exception e){ Log.e(TAG, "Error saving crimes: ", e); return false; } }

ObjectJSON:

ObjectJSON:

public class ObjectJSON { private Context mContext; private String mFilename; public ObjectJSON(Context context, String filename) { mContext = context; mFilename = filename; } public void saveReminders(ArrayList<Object> objects) throws JSONException, IOException { Log.i("Save","saveReminders"); JSONArray array = new JSONArray(); for (Object f : objects) array.put(f.toJSON()); Writer writer = null; try { OutputStream out = mContext.openFileOutput(mFilename, Context.MODE_APPEND); writer = new OutputStreamWriter(out); writer.write(array.toString()); } finally { if (writer != null) writer.close(); } } public ArrayList<Object> loadReminders() throws IOException, JSONException { Log.i("Save","loadReminders"); ArrayList<Object> objects = new ArrayList<Object>(); BufferedReader reader = null; try { InputStream in = mContext.openFileInput(mFilename); reader = new BufferedReader(new InputStreamReader(in)); StringBuilder jsonString = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { jsonString.append(line); } JSONArray array = (JSONArray) new JSONTokener(jsonString.toString()) .nextValue(); for (int i = 0; i < array.length(); i++) { objects.add(new Object(array.getJSONObject(i))); } } catch (FileNotFoundException e) { //when 0 } finally { if (reader != null) reader.close(); } return objects; }

ObjectListFragment:

ObjectListFragment:

public class ObjectListFragment extends Fragment { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private RecyclerAdapter mAdapter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.reminder_activity, container, false); Log.i("ObjectListFragment", "onCreateView"); final ArrayList<Object> mData = ObjectLab.get(getActivity()).getObjects(); getActivity().setTitle("Object"); mRecyclerView = (RecyclerView)v. findViewById(R.id.my_recycler_view); //registerForContextMenu(mRecyclerView); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new RecyclerAdapter(mData); mRecyclerView.setAdapter(mAdapter); mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(v.getContext(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.i("ObjectListFragment", "onItemClick"); Object f = mData.get(position); FragmentManager fm = getFragmentManager(); Fragment mFragment = fm.findFragmentById(R.id.fragment_container); Bundle bundle = new Bundle(); bundle.putSerializable(ObjectFragment.EXTRA_REMINDER_ID, f.getId()); if (mFragment != null) { mFragment = new ObjectFragment(); mFragment.setArguments(bundle); fm.beginTransaction().addToBackStack(null) .replace(R.id.fragment_container, mFragment) mit(); } } })); return v; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_main, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); Log.d("Testing", "ID == " + id); switch (id) { case R.id.action_settings: { Log.d("onOptionsItemSelected", " SETTings"); Object f = new Object(); ObjectLab.get(getActivity()).addReminder(f); FragmentManager fm = getFragmentManager(); Fragment mFragment = fm.findFragmentById(R.id.fragment_container); Bundle bundle = new Bundle(); bundle.putSerializable(ObjectFragment.EXTRA_REMINDER_ID, f.getId()); if (mFragment != null) { mFragment = new ObjectFragment(); mFragment.setArguments(bundle); fm.beginTransaction().addToBackStack(null) .replace(R.id.fragment_container, mFragment) mit(); } return true; } } return super.onOptionsItemSelected(item); } }

RecyclerAdapter:

RecyclerAdapter:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { ArrayList<Object> mData; public RecyclerAdapter(ArrayList<Object> objects) { mData = objects; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.reminder_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTitleTextView.setText(mData.get(position).getTitle()); } @Override public int getItemCount() { return mData.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private TextView mTitleTextView; public ViewHolder(View itemView) { super(itemView); mTitleTextView = (TextView) itemView.findViewById(R.id.forget_list_titleTextView); } }

RecyclerItemClickListener:

RecyclerItemClickListener:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildLayoutPosition(childView)); return true; } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { }

最后一个ObjectFragmet

and last ObjectFragmet

public class ObjectFragment extends Fragment{ public static final String EXTRA_REMINDER_ID = "id"; private Object mObject; public static ObjectFragment newInstance(UUID crimeId) { Log.i("ObjectFragment", "newInstance"); Bundle args = new Bundle(); args.putSerializable(EXTRA_REMINDER_ID, crimeId); ObjectFragment fragment = new ObjectFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); UUID uuid = (UUID) getArguments().getSerializable(EXTRA_REMINDER_ID); Log.i("ObjectFragment", " "+uuid); mObject = ObjectLab.get(getContext()).getReminder(uuid); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.remind_act, container, false); EditText editText = (EditText)v.findViewById(R.id.editText1); editText.setText(mObject.getTitle()); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { mObject.setTitle(charSequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }); return v; } @Override public void onPause() { super.onPause(); Log.i("ObjectFragment", "onPause"); ObjectLab.get(getActivity()).saveReminders(); }

链接到项目(Android Studio). 我的问题是我没有.高兴地听到您关于该主题以及非主题的所有评论和建议. 您的帮助不会让您无人值守.

Links to the project(Android Studio). Where my problem is that I do not. With pleasure hear all your comments and advice on the topic as well as that off-topic. Your help will not forsake unattended.

推荐答案

打开OutputStream写入文件时,您使用的是Context.MODE_APPEND标志,这会导致写入操作追加而不覆盖.如您所愿,将其更改为:

When opening the OutputStream for writing into the file, you're using the Context.MODE_APPEND flag, which is causing the write operation to append and not overwrite as you intended, change it to:

OutputStream out = mContext.openFileOutput(mFilename, 0);

此外,完全不必提及RecyclerView,因为它与当前的问题无关.

Also, there was no need to mention the RecyclerView at all, since it has nothing to do with the problem at hand.

更多推荐

RecyclerView将元素保存为JSON

本文发布于:2023-11-26 17:19:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1634486.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:保存为   元素   RecyclerView   JSON

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!