如何在不丢失所有数据的情况下刷新 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();
}
我想通过单击某个 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();
}