android - listview在按回按钮时丢失数据行

时间:2017-11-29 23:47:52

标签: java android listview

请帮我解决一下我在Android开发项目中使用ListView及其相关数据的问题。

我有一个名为OrderForm的活动,它由活动UserProfile中的Intent启动,如下所示:

在UserProfile中

Intent intent = new Intent(this, OrderForm.class);
        startActivity(intent);

然后在OrderForm中有一个EditText和一个添加按钮,用于将String项添加到ArrayList,并相应地填充UI。

当我单击后退按钮(返回到UserProfile)并再次通过Intent转到OrderForm时,UI不会显示列表项,为什么会这样?

我意识到我可以使用Room进行持久性甚至SharedPreferences,但是 我想看看是否有更干净,更有效的方法,否则代码越少越好。

另外,也许我没有正确理解它们,但我尝试了onSaveInstanceState和onRestoreInstanceState,它们不适合我。

提前致谢。

以下是来自 OrderForm

的代码的一部分
public class OrderForm extends AppCompatActivity {

ArrayList<String> list;
ListView itemList;
ArrayAdapter<String> arrayAdapter;

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

    itemList = findViewById(R.id.itemList);

    itemText = findViewById(R.id.item);
    linearLayout = findViewById(R.id.no_items_container);
    orderContainer = findViewById(R.id.orderContainer);

    list = new ArrayList<>();

    arrayAdapter = new ArrayAdapter<String>(this,
            R.layout.list_item,R.id.rowItem, list)
    {
        @Override
        public View getView(int position,
                            View convertView,
                            ViewGroup parent) {
          // some custom stuff here
        }
    }

public void addItem(View view)
{
    String item = itemText.getText().toString().trim().toLowerCase();

    if(!item.isEmpty() && list.indexOf(item) == -1) {
        arrayAdapter.add(item);
    }
}

2 个答案:

答案 0 :(得分:0)

您需要了解活动生命周期的工作原理。

https://developer.android.com/guide/components/activities/activity-lifecycle.html

您的问题是,当按下后退按钮时,您的OrderForm活动将被销毁,并且您的arraylist / list视图将被有效销毁。要避免这个问题,您必须将值存储在某处,例如SharedPreferences,创建一个包含字符串并存储它的文本文件,或者将arraylist返回到您将存储/处理它们的UserProfile类(为此使用startActivityForResult()而不是startActivity())

答案 1 :(得分:0)

  

当我单击后退按钮(返回到UserProfile)并再次通过Intent转到OrderForm时,UI不会显示列表项,为什么会这样?

onCreate()方法中,您有:

list = new ArrayList<>();
arrayAdapter = new ArrayAdapter<String>(..., list)...

除非您以某种方式保留数据,否则在您的活动启动时list始终为空。

  

我意识到我可以使用Room进行持久性甚至SharedPreferences,但我想看看是否有更干净,更有效的方法,否则代码越少越好。

您需要存储的确切内容将有助于定义存储它的最佳方式。对于简单的字符串列表,可能SharedPreferences是最简单的解决方案。

  

另外,也许我没有正确理解它们,但我尝试了onSaveInstanceState和onRestoreInstanceState,它们不适合我。

这些方法用于在活动被销毁然后重新创建时存储数据,这通常在用户旋转设备时发生(但也可能由于各种其他原因而发生)。当您退出您的活动时(通过按back到UserProfile),这些方法都不会被触发。