首页 > 解决方案 > 始终添加到最后一个 Listitem 位置并保持它

问题描述

在我的应用程序上,用户可以输入每小时更新的金额。例如,在第一个小时,他们会输入 100 并将其添加到最后一个。他们将导航到不同的活动,然后在下一小时到来时返回该活动并输入 200。

这似乎工作正常,尽管在可能一两个条目之后,列表似乎有了自己的想法并开始随机排序列表。

我想要实现的截图:

达到

正在发生的事情的屏幕截图(通常在第三个条目之后): 在此处输入图像描述

正如你所看到的,第三个已经占据了第二个的位置,这是随机发生的,他们去了不同的位置。

这是我的代码:

@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();
}

}

任何人都可以帮助我,以便每次它添加到最后一个位置并且当我再次返回该活动时,它会保持该位置。

谢谢

标签: javaandroidarrayslistviewsharedpreferences

解决方案


如果您想保留插入顺序(可以有重复的元素),请始终使用 List,当顺序无关紧要并且您不想要重复数据时使用 HashSet。

用 List 而不是 HashSet 改变你的 onPause() 和 onResume()

     @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();
        }

    }

推荐阅读