#android #android-listview #sharedpreferences
#Android #android-listview #sharedpreferences
Вопрос:
В настоящее время у меня есть пользовательский listview
интерфейс с двумя строками текста в каждом элементе, один для текущего времени и один для текста, вводимого пользователем. Я делаю это путем создания нового hashmap
и добавления к <ArrayList<HashMap<String,String>>
тому, что listview
использует. Я хотел бы сохранить свои данные в sharedPreferences
, но, похоже, я получаю только последний ввод от пользователя. Мой вопрос: есть ли способ извлечь данные из listview, а затем добавить их в sharedpreferences? Или добавить данные из arraylist в sharedpreferences?
Вот мой код ниже:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_feed);
//create button and implement on click listener
sendButton = this.findViewById(R.id.sendPostButton);
sendButton.setOnClickListener(this);
//create text field and add text change listener
postTextField = (EditText)findViewById(R.id.postTextField);
postTextField.addTextChangedListener(TextEditorWatcher);
//create text views for seeing the posts and character count
currentTimeTextView = (TextView)findViewById(R.id.postTimeTextView);
mainPostTextView = (TextView)findViewById(R.id.postTextView);
characterCountView = (TextView)findViewById(R.id.charsleft);
characterCountView.setText("150 chars left");
//text view for event name and set the text
feedName = (TextView)findViewById(R.id.nameOfFeed);
currentFeedName = CreateFeedActivity.eventFeedName;
feedName.setText(currentFeedName);
list = new ArrayList<HashMap<String,String>>();
//create the adapter for the list view
adapter = new SimpleAdapter(
this,
list,
R.layout.post_layout,
new String[]{"time", "post"},
new int[]{R.id.postTimeTextView, R.id.postTextView});
//set list adapter
setListAdapter(adapter);
//place the current feed number into a variable here
currentFeedCount = CreateFeedActivity.feedCount;
//create the hashmap for the list view
feedPostMap = new HashMap<String, String>();
//place the stored data into the view again if activity has already been created
if (LiveFeedrHomeActivity.feedOccurs == 1){
Log.d(TAG, "in feed occurs is 1");
//get the shared pref
sharedPref = getSharedPreferences(MY_FEED, 0);
Map<String, ?> map = new HashMap<String, String>();
map = sharedPref.getAll();
//convert from the map to the hashmap
feedPostMap = (HashMap<String, String>) map;
//add to the list
list.add(feedPostMap);
//refresh the adapter
adapter.notifyDataSetChanged();
Log.d(TAG, "feedmap get all");
}
//make variable feed = 1 so that you can't create another feed
LiveFeedrHomeActivity.feedOccurs = 1;
}
@Override
public void onClick(View button) {
switch(button.getId()){
case R.id.sendPostButton:
//create date
date = new Date();
//get current time
currentTime = new SimpleDateFormat("h:mm aaa").format(date);
SendToDatabase();
DisplayUserInput();
break;
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "on stopp'd");
//get shared pref settings
sharedPref = getSharedPreferences(MY_FEED, 0);
sharedPrefEditor = sharedPref.edit();
//get the items in the hash map and add it to the
//shared preferences
for (String string : feedPostMap.keySet()){
sharedPrefEditor.putString(string, feedPostMap.get(string));
// }
sharedPrefEditor.commit();
}
Комментарии:
1. Посмотрите на мой ответ, надеюсь, это вам поможет.
2. Можете ли вы сказать мне, почему вы хотите хранить данные в общих настройках? Это из соображений безопасности или вы не хотите делиться этим с другими?
3. Ну, я просто хочу сохранить элементы, которые пользователь вводит в
listview
, чтобы, когда они вернутся к текущему действию, listview будет повторно заполнен. Я предполагал, что SharedPreferences будет правильным решением, но, возможно, нет? должен ли я сохранять пакет или что вы рекомендуете?4. Если вы не уничтожите свою активность и просто перейдете к другому, то ваши данные в listview останутся такими, какие они есть, поэтому вам не нужно использовать SharedPreference при возврате к первому действию onActivityResult(), тогда ваша активность останется в том же состоянии. Нет необходимости снова создавать Activity.
Ответ №1:
Я думаю, ваша проблема в том, что это цикл for,
for (String string : feedPostMap.keySet()){
sharedPrefEditor.putString(string, feedPostMap.get(string));
}
так что попробуйте,
Set<String> s = new HashSet<String>();
for (int i=0;i<list.size();i ){
s.add(list.get(i).get(string));
}
sharedPrefEditor.putStringSet(stringSet, s);
Попробуйте это, для набора строки для редактирования в sharedpreference,
putStringSet(String key, Set<String> values)
Установите набор строковых значений в редакторе настроек, которые будут записаны обратно при вызове commit() .
для получения дополнительной информации посмотрите на Android-SharedPreferences
Комментарии:
1. Я попробую это прямо сейчас. Должен ли я включать
commit()
илиapply()
? Большое спасибо2. кроме того, что такое строка, установленная в
sharedPrefEditor.putStringSet(stringSet, s);
?3. Хорошо, итак, я узнал, что
putStringSet
это работает только для API 11 и выше. Я пишу для API 8 и выше. Есть ли способ обойти это? Спасибо.4. для API 8 вы должны хранить в качестве предварительного типа данных только строку, поэтому вам нужно хранить во многих разных ключах и значениях.