Извлечение данных из listview

#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 вы должны хранить в качестве предварительного типа данных только строку, поэтому вам нужно хранить во многих разных ключах и значениях.