如何在不丢失所有数据的情况下刷新 activity?

How to refresh activity without losing all data?

我想通过单击某个 ImageButton 来删除一个对象。当我这样做时,该项目只会在我执行另一个操作时消失。我做了研究,可以通过刷新 activity 来改变它。问题是,当我这样做时,所有其他项目也会从我的列表中消失。我想通过 SQLite 将对象添加到 Table,然后再次检索它们。有没有更简单的方法?

谢谢。

编辑

当我点击猕猴桃十字架将其移除时

如果我有这个:

 public void removeProduct(View v) {

    Integer position = (Integer) v.getTag();

    Product p1 = (Product) adapter.getItem(position);
    productsGridView.remove(p1);
 }

它会删除,但只有当我点击应用程序的其他部分时才会删除,所以不会立即删除。

我正在寻找一种方法来立即完成。我在想这个

public void removeProduct(View v) {

    Integer position = (Integer) v.getTag();

    Product p1 = (Product) adapter.getItem(position);
    productsGridView.remove(p1);

    Intent intent = getIntent();
    finish();
    startActivity(intent);
    }

但结果我在列表中得到了 0 种产品,而不是莫兰戈和香蕉...

只需刷新视图而不是整个视图activity。这样您就可以将数据保存在当前的 activity 实例中。

如果您确实需要刷新 activity,可能有一种棘手的解决方法。棘手的方式意味着我做的方式可能不适合这种情况。你试过静态属性吗?当在 activity 中触发 finish() 时,不会释放静态 属性。当 activity 重建时,您可以从静态 属性 加载数据。这是我的测试应用程序。

public class MainActivity extends AppCompatActivity {

    private static ArrayList<Integer> list;

    private Button btn;
    private int counter = 0;
    private TextView textView;

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

        btn = (Button) findViewById(R.id.test);
        textView = (TextView) findViewById(R.id.text);

        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (list == null) {
                    list = new ArrayList<Integer>();
                }
                list.add(counter++);
                Toast.makeText(MainActivity.this, counter + "", Toast.LENGTH_SHORT).show();
                if (counter == 2) {
                    Intent intent = getIntent();
                    finish();
                    startActivity(intent);
                }
            }
        });

        if (list == null)
            Toast.makeText(MainActivity.this, "List is null", Toast.LENGTH_SHORT).show();
        else
            textView.setText("The list size is " + list.size() + "\nThe counter is " + counter);
    }
}

XML布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.myapplication.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Test" />
</RelativeLayout>

希望这对您有所帮助。确实F43nd1r的解决方案post应该是一个很好的解决方案,只刷新视图。

刷新activity没有必要。 您应该从列表中删除您的项目并使用 adapter.notifyDataSetChanged() 或 adapter.notifyItemRemoved(position).

通知适配器

只需刷新适配器而不是重新启动 Activity

public void removeProduct(View v) {

    Integer position = (Integer) v.getTag();

    Product p1 = (Product) adapter.getItem(position);
    productsGridView.remove(p1);

    adapter.notifyDataSetChanged();
}