Всегда добавлять в последнюю позицию Listitem и поддерживать его - PullRequest
0 голосов
/ 06 июля 2018

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

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

Скриншот того, чего я пытаюсь достичь:

Achieve

Скриншот происходящего (обычно после 3-й записи): enter image description here

Как видите, третий занял позицию второго, и это происходит случайным образом, и они переходят в разные позиции.

Вот мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.processing);

    sharedPreferences = getSharedPreferences("MYPREFS", MODE_PRIVATE );

    textView = (TextView)findViewById(R.id.textView);
    btnShippersCompleted = (Button)findViewById(R.id.button4) ;
    listView = (ListView)findViewById(R.id.listview1);

    clear = (Button) findViewById(R.id.buttonClear);

    clear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            listView.setAdapter(null);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.clear();
            editor.apply();
        }
    });


    handler = new Handler() ;

    ListElementsArrayList = new ArrayList<String>(Arrays.asList(ListElements));

    adapter = new ArrayAdapter<String>(Processing.this,
            android.R.layout.simple_list_item_1,
            ListElementsArrayList
    );

    listView.setAdapter(adapter);


    btnShippersCompleted.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            listView.setAdapter(adapter);
            shippersCompleted = textView.getText().toString();
            Hour = sharedPreferences.getInt("Hour", 1);
            ListElementsArrayList.add(shippersCompleted + "- Hour " + Hour++);
            adapter.notifyDataSetChanged();
        }
    });
}

@Override
protected void onPause() {
    super.onPause();
    //Set the values
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Set<String> set = new HashSet<String>();
    set.addAll(ListElementsArrayList);
    editor.putStringSet("list", set);
    editor.putInt("Hour", Hour);
    editor.apply();
    }


@Override
public void onResume() {
    super.onResume();
    Set<String> set = sharedPreferences.getStringSet("list", null);
    if(set != null) {
        ListElementsArrayList.addAll(set);
        listView.setAdapter(adapter);
    } else {
        Toast.makeText(Processing.this, "No records have been saved!", Toast.LENGTH_LONG).show();
    }

}

@Override
public void onStop() {
    super.onStop();
}

@Override
public void onDestroy() {
    super.onDestroy();
}
* *} Тысяча двадцать-один

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Используйте только списки, а не наборы. Проблема именно в HashSet, который меняет порядок.

Чтобы решить проблему с сохранением вашего списка в prefs, вы можете преобразовать его в строку и сохранить его. В onResume вы можете прочитать строку String и преобразовать ее обратно в массив.

// Use some delimiter that will surely not be used in your array elements
private static final DELIMITER="//";
private String convertToString(ArrayList<String> list) {

        StringBuilder sb = new StringBuilder();
        String delim = "";
        for (String s : list)
        {
            sb.append(delim);
            sb.append(s);
            delim = DELIMITER;
        }
        return sb.toString();
    }

 private ArrayList<String> convertToArray(String string) {
        ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(DELIMITER)));
        return list;
    }

Итак, когда вы сохраняете ваш массив, сохраняйте его как

 prefEditor.putString("my_array", convertToArray(myList));

вернуть его как

 myArray = convertArrayToString(prefs.getString("my_array", "");

Адаптируйте имена переменных соответственно.

0 голосов
/ 06 июля 2018

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

Измените вас onPause () иonResume () со списком вместо HashSet

     @Override
        protected void onPause() {
        super.onPause();
        //Set the values
        SharedPreferences.Editor editor = sharedPreferences.edit();
        //save in LinkedHashSet instead of HashSet
        Set<String> set = new LinkedHashSet<String>();
        set.addAll(ListElementsArrayList);
        editor.putStringSet("list", set);
        editor.putInt("Hour", Hour);
        editor.apply();
        }
           @Override
     public void onResume() {
        super.onResume();
        //get saved list and set if for display
        Set<String> set = sharedPreferences.getStringSet("list", null);
        if(set != null) {
            ListElementsArrayList.addAll(set);
            listView.setAdapter(adapter);
        } else {
            Toast.makeText(Processing.this, "No records have been saved!", 
    Toast.LENGTH_LONG).show();
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...