2017-02-07 2 views
-1

Я новичок в android.here Я делаю простой список контактов приложения. когда пользователь нажимает на элементы контакта, свяжитесь с ним в списке избранных. но проблема в том, что когда пользователь нажимает на первый элемент контакта для добавления избранного, тогда пользователь нажимает второй контакт, но первый элемент автоматически удаляется. Общие настройки перезаписывают другое значение, я хочу добавить элемент в список, чтобы я добавил, чтобы добавить контакты в список избранного.SharedPreferences перезаписывает другое значение?

Первый фрагмент:

imageViewfavourite.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
       SharedPreferences.Editor editor = preferences.edit(); 

       editor.putString("name1", Pname); 
       editor.putString("number1", Pnumber); 
       editor.putString("image1", temp); 
       editor.putInt("pos", position); 

       Log.e("a", "name1" + Pname); 
       Log.e("a", "number1" + Pnumber); 
       Log.e("a", "image1" + temp); 

       editor.commit(); 

      } 
     }); 

Второй фрагмент:

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

View view = inflater.inflate(R.layout.fragment_fragment_fv, container, false); 
recyclerView = (RecyclerView) view.findViewById(R.id.favourite_list); 
selectUsers = new ArrayList<DataContact>(); 

SharedPreferences preferences = getActivity().getPreferences(0); 
String Pname = preferences.getString("name1", ""); 
String Pnumber = preferences.getString("number1", ""); 
String Pimage = preferences.getString("image1", ""); 

byte[] encodeByte = Base64.decode(Pimage, Base64.DEFAULT); 
bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length); 

Log.v("name1", Pname); 
Log.v("number1", Pnumber); 
Log.v("image1", Pimage); 

DataContact selectUser = new DataContact(); 
selectUser.setName(Pname); 
selectUser.setPhone(Pnumber); 
selectUser.setThumb(bitmap); 
selectUsers.add(selectUser); 

adapter = new AdapterFv(getActivity(), ""); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setOrientation(LinearLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(llm); 
adapter.setData(selectUsers); 
recyclerView.setAdapter(adapter); 

return view; 
} 
+0

yes, значение будет перезаписано, если вы добавите значения под одним и тем же ключом для sharedPreference. –

+0

Вы можете добавить избранные контакты в массивList, а затем преобразовать его в json и сохранить строку в SharedPref. когда вы загружаете свой контакт, загрузите json и пометьте его как избранный. –

+0

Общие предпочтения используются для хранения определенных значений сеанса в формате ключевых значений, если вы хотите сохранить несколько значений для будущих использования, вы должны использовать базу данных SQLite, которая является надлежащим способом хранения структурированных данных. –

ответ

0

долевой предпочтения, вы помещаете значение и редактирования значения с помощью KEY, если вы используете один и тот же ключ, который перепишет свою ценность. потому что общая привилегия, содержащая пару KEY VALUE, если вы хотите сохранить данные, использует базу данных SQLite. Общие предпочтения могут содержать только одно значение для каждой клавиши

0

Перед тем, как задать вопрос, необходимо указать api documentation.

Объяснить

SharedPreferences поддерживается хранилище данных (1: 1 ключ-значение матча) Таким образом, ключ может иметь только один элемент данных.

Storable Типы

  • булево
  • поплавок
  • INT
  • долго
  • Строка
  • Set < String>

Простое решение

// in Second Fragment 
String Pname = preferences.getString("name2", ""); 
String Pnumber = preferences.getString("number2", ""); 
String Pimage = preferences.getString("image2", ""); 

Ссылка

https://developer.android.com/reference/android/content/SharedPreferences.html

0

Вы добавляете второй контакт с теми же ключами, которые вы использовали для первого контакта. Что вам нужно, это какой-то счетчик, который отслеживает количество контактов, которые вы сохранили, а затем соответствующим образом меняет свои ключи.

Если я не ошибаюсь, то вы используете

положение

как счетчик. Вам просто нужно изменить ключи. Хорошим решением было бы сделать отдельные методы для записи и извлечения контактов из общих настроек.

public void writeContact(String Pname, String Pnumber, String temp,int position) 
{ 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
      SharedPreferences.Editor editor = preferences.edit(); 

      editor.putString("name"+position, Pname); 
      editor.putString("number"+position, Pnumber); 
      editor.putString("image"+position, temp); 

      editor.commit(); 
} 


public DataContact getContact(int position) 
{ 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

    DataContact selectUser = new DataContact(); 

    selectUser.setName(preferences.getString("name"+position, "")); 
    selectUser.setPhone(preferences.getString("number"+position, "")); 
    selectUser.setThumb(preferences.getString("image"+position, "")); 

    return selectUser; 
} 

Это должно быть сделано. Теперь, чтобы сохранить ваш контакт, вам нужно вызвать метод writeContact в onClick(). Аналогичным образом вы можете вызвать getContact() с положением как параметром, чтобы получить контакты.

0

Лучшим способом было бы использовать базу данных. Но если вы хотите использовать SharedPreferences для сохранения своих данных, вы можете создать класс Serializable User и class Preference для управления вашими SharedPreferences как @AmitBhati.

public class Preference { 

    private static final String USER_JSON = "user_json"; 

    private SharedPreferences mSettings; 
    private Context ctx; 

    public Preference(Context context) { 
     ctx = context; 
     mSettings = PreferenceManager.getDefaultSharedPreferences(context); 
    } 

    public void setUsersJson(List<User> u){ 
     Gson gson = new Gson(); 
     String jsonStr = gson.toJson(u); 
     SharedPreferences.Editor editor = mSettings.edit(); 
     editor.putString(USER_JSON, jsonStr); 
     editor.apply(); 
    } 
    public List<User> getUsersJson(){ 
     Gson gson = new Gson(); 
     String jsonStr = mSettings.getString(USER_JSON, null); 
     Type listType = new TypeToken<List<HourlyWeather>>(){}.getType(); 
     return (List<User>) gson.fromJson(jsonStr, listType); 
    } 
} 
0

Я также использую Shared preference, а также сомневался в том же предмете, он переписывается. Ваша проблема кажется немного иной, чем моя, учитывая размер списка контактов, то, что я использовал, была создана отдельная функция, в которой я буду отправлять значение ключа, например: key_val_, теперь, поскольку будет использоваться «n» контактов для цикла и добавить его с указанной строкой.

Строка string = key_val_;

для (INT I = 0; я < п; я ++) {

editor.putInt (строка + I, ur_value); }

Не уверен, что это вызвало проблемы с памятью в вашем случае.