java - SharedPreferences 数据分布在每个 fragment 上

标签 java android database android-fragments gson

我的 SharedPreferences 的日期有问题。我正在使用 5 Fragment,您可以在其中动态地将项目添加到 RecyclerView。问题是,当我将数据保存在特定 fragment 上并重新加载应用程序时,已保存的值会加载到我的每个 fragment 中。它实际上将数据保存到它所在的 fragment 中。我正在使用 Gson 来保存我的项目 ArrayList

这是我的Fragment(Fragment0共5个,其他只是复制和重构)

package com.example.barryblack;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;

import static android.content.Context.MODE_PRIVATE;

public class FragmentPage0 extends Fragment {

private ExampleAdapter mAdapter;
private EditText editTask;
ArrayList<MyItem> items;
private Button insertbtn;
private Button stateButton;
private TextView taskText;
private String task;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
   Bundle savedInstanceState) {

    CreateExampleList();

    View view = inflater.inflate(R.layout.page_fragment0, container, false);

    loadData();

    RecyclerView recyclerView = view.findViewById(R.id.listRecyclerView);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemViewCacheSize(500);
    mAdapter = new ExampleAdapter(items);
    recyclerView.setAdapter(mAdapter);


    taskText = view.findViewById(R.id.tv_country);
    insertbtn = view.findViewById(R.id.button_insert);
    editTask = view.findViewById(R.id.editTask);
    stateButton = view.findViewById(R.id.tv_button);

    insertbtn.setEnabled(false);
    editTask.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            String taskInput = editTask.getText().toString().trim();
            insertbtn.setEnabled(!taskInput.isEmpty());

        }

        @Override
        public void afterTextChanged(Editable s) {
            task = editTask.getText().toString().trim();

        }
    });

    insertbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InsertItem();
            SaveData();
            editTask.setText(null);
        }
    });

    return view;
}

private void SaveData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("shared 
preferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(items);
    editor.putString("task list", json);
    editor.apply();
}

private void loadData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("shared 
preferences", MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("task list", null);
    Type type = new TypeToken<ArrayList<MyItem>>() {
    }.getType();
    items = gson.fromJson(json, type);

    if (items == null) {
        items = new ArrayList();
    }

}

public void InsertItem() {

    items.add(new MyItem(task, stateButton));
    mAdapter.notifyItemInserted(items.size());
}

private void CreateExampleList() {
    items = new ArrayList<MyItem>();
}

ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, 
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder 
viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        items.remove(viewHolder.getAdapterPosition());
        mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
        SaveData();

    }
};

}

这是我的适配器。我认为问题出在 OnCreateViewHolder 内部,但我不确定

package com.example.barryblack;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<MyItem> mExampleList;

public static class ExampleViewHolder extends RecyclerView.ViewHolder {
    public TextView mTextView;
    private EditText topicName;
    public Button mButton;
    private int clicks = 1;

    public static final String SHARED_PREFS = "sharedPrefs";
    public static final String TOPIC = "topic";
    public static final String CLICKS = "clicks";

    public ExampleViewHolder(View itemView) {
        super(itemView);
        mTextView = itemView.findViewById(R.id.tv_country);
        mButton = itemView.findViewById(R.id.tv_button);
        topicName = itemView.findViewById(R.id.editText);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicks++;

                if (clicks % 2 == 0) {
                    mButton.setBackgroundResource(R.drawable.button_green);
                }else
                    mButton.setBackgroundResource(R.drawable.button_red);
            }
        });
    }

}

public ExampleAdapter(ArrayList<MyItem> exampleList) {

    mExampleList = exampleList;
}

@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.example_item, parent, false);

    ExampleViewHolder evh = new ExampleViewHolder(v);
    return evh;
}

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
    MyItem currentItem = mExampleList.get(position);

    holder.mTextView.setText(currentItem.getTaskText());
}

@Override
public int getItemCount() {
    return mExampleList.size();
}
}

最佳答案

将其用于您的 fragment 。所以每个 fragment 都有自己的SharedPreferences

 private static final String SHARED_PREFS_FRAGMENT_A = "fragmentA";
 private static final String SHARED_PREFS_FRAGMENT_B = "fragmentB";
...

SharedPreferences sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS_FRAGMENT_A , MODE_PRIVATE);

关于java - SharedPreferences 数据分布在每个 fragment 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61269306/

相关文章:

java - 引用与现有类型同名的类

java - JSF - 如何在 <h :messages> in a visually appealing way? 中格式化我的全局消息

android - fragment 在移除时闪烁

android - Android 动画中的 XScale 与 XDelta

java - Firebase 应用程序可以在模拟器上运行,但不能在真实的 Android 设备上运行?

database - 当我初始化 greenplum 时,它会打印 [FATAL] :-Errors generated from parallel processes

java - 如何在 playframework 2.0 java 中加密数据?

java - 测试:无法注册 MBean 实例已经存在

mysql - 重命名 100GB 表

database - 如何将 +0000 UTC 转换为 +0100 CET