为什么我的 TaskLoader 只存储最后的数据?
Why does my TaskLoader only stores the last data?
我的代码流有问题。请请帮助:(
好的,流程是这样的。第一个 Activity 加载存储 ArrayList
数据的 recyclerview
。 Arraylist
的数据包含有关 Premise
的信息,它从网站的 API
检索。它使用 GET
方法。
好的,接下来当我 select 来自 recyclerview
的项目时,它会将我带到 next Activity
,我将输入 integer
。然后,当它 returns 到 first Activity
时,它传递 integer
值和 recyclerview
项目的 index
。 recyclerview
使用 index
更新项目并将 integer
值存储在项目中。
所以,我的问题是:当我重复 select 从 recyclerview
中输入一个项目并输入一个整数的过程时,第一个 activity 只存储最新的数据。上一个项目不见了。
我到底哪里做错了?我是移动应用程序开发的新手。请帮忙。我真是一无所知。
这是第一个 Activity。它叫做 MainActivity:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<Premise>> {
private NotificationManagerCompat notificationManager;
private LoaderManager loaderManager;
private RecyclerView rcvPremises;
private EditText premiseSearch;
String pTrackVisitor_s, pPosition_s, pPremiseName, pLocation;
int pTrackVisitor, pPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loaderManager = LoaderManager.getInstance(this);
premiseSearch = findViewById(R.id.search);
rcvPremises = findViewById(R.id.rcvPremise);
Intent mainIntent = getIntent();
pTrackVisitor_s = mainIntent.getStringExtra("trackVisitor");
pPosition_s = mainIntent.getStringExtra("position");
if (pTrackVisitor_s != null) {
pTrackVisitor = Integer.parseInt(pTrackVisitor_s);
pPosition = Integer.parseInt(pPosition_s);
} else {
pTrackVisitor = 0;
pPosition = 0;
}
}
@NonNull
@Override
public Loader<ArrayList<Premise>> onCreateLoader(int id, @Nullable Bundle args) {
return new PremisesListTaskLoader(this, pTrackVisitor, pPosition);
}
@Override
public void onLoadFinished(@NonNull Loader<ArrayList<Premise>> loader, ArrayList<Premise> vPremise) {
loaderManager.destroyLoader(0);
if (!vPremise.isEmpty()) {
rcvPremises.setAdapter(new PremiseAdapter(this, vPremise));
rcvPremises.setLayoutManager(new LinearLayoutManager(this));
premiseSearchBar(premiseSearch, vPremise);
} else
Toast.makeText(this, "Unable to load data from iiotisme.com", Toast.LENGTH_LONG).show();
}
@Override
public void onLoaderReset(@NonNull Loader<ArrayList<Premise>> loader) {
}
}
如果您需要更多的编码部分,请告诉我。我会分享它们。
首先,你不应该读取onCreate
中的数据,它只会在Activity第一次创建时触发,我假设你的activity会恢复,它应该使用 onActivityResult
之类的东西。您应该使用 startActivityForResult
开始第二个 activity,在 onActivityResult
中,您将获得一个 intent
,您每次都可以从中读取最新数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data == null)
return;
pTrackVisitor_s = data.getStringExtra("trackVisitor");
pPosition_s = data.getStringExtra("position");
if (pTrackVisitor_s != null) {
pTrackVisitor = Integer.parseInt(pTrackVisitor_s);
pPosition = Integer.parseInt(pPosition_s);
} else {
pTrackVisitor = 0;
pPosition = 0;
}
}
您可以使用 intent
将 index
和其他所需数据传递给您的第二个 activity,如下所示
Intent data = new Intent();
data.putExtra("position", <yourClickedIndex>);
startActivityForResult(1234, SecondActivity.class);
我的代码流有问题。请请帮助:(
好的,流程是这样的。第一个 Activity 加载存储 ArrayList
数据的 recyclerview
。 Arraylist
的数据包含有关 Premise
的信息,它从网站的 API
检索。它使用 GET
方法。
好的,接下来当我 select 来自 recyclerview
的项目时,它会将我带到 next Activity
,我将输入 integer
。然后,当它 returns 到 first Activity
时,它传递 integer
值和 recyclerview
项目的 index
。 recyclerview
使用 index
更新项目并将 integer
值存储在项目中。
所以,我的问题是:当我重复 select 从 recyclerview
中输入一个项目并输入一个整数的过程时,第一个 activity 只存储最新的数据。上一个项目不见了。
我到底哪里做错了?我是移动应用程序开发的新手。请帮忙。我真是一无所知。
这是第一个 Activity。它叫做 MainActivity:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<Premise>> {
private NotificationManagerCompat notificationManager;
private LoaderManager loaderManager;
private RecyclerView rcvPremises;
private EditText premiseSearch;
String pTrackVisitor_s, pPosition_s, pPremiseName, pLocation;
int pTrackVisitor, pPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loaderManager = LoaderManager.getInstance(this);
premiseSearch = findViewById(R.id.search);
rcvPremises = findViewById(R.id.rcvPremise);
Intent mainIntent = getIntent();
pTrackVisitor_s = mainIntent.getStringExtra("trackVisitor");
pPosition_s = mainIntent.getStringExtra("position");
if (pTrackVisitor_s != null) {
pTrackVisitor = Integer.parseInt(pTrackVisitor_s);
pPosition = Integer.parseInt(pPosition_s);
} else {
pTrackVisitor = 0;
pPosition = 0;
}
}
@NonNull
@Override
public Loader<ArrayList<Premise>> onCreateLoader(int id, @Nullable Bundle args) {
return new PremisesListTaskLoader(this, pTrackVisitor, pPosition);
}
@Override
public void onLoadFinished(@NonNull Loader<ArrayList<Premise>> loader, ArrayList<Premise> vPremise) {
loaderManager.destroyLoader(0);
if (!vPremise.isEmpty()) {
rcvPremises.setAdapter(new PremiseAdapter(this, vPremise));
rcvPremises.setLayoutManager(new LinearLayoutManager(this));
premiseSearchBar(premiseSearch, vPremise);
} else
Toast.makeText(this, "Unable to load data from iiotisme.com", Toast.LENGTH_LONG).show();
}
@Override
public void onLoaderReset(@NonNull Loader<ArrayList<Premise>> loader) {
}
}
如果您需要更多的编码部分,请告诉我。我会分享它们。
首先,你不应该读取onCreate
中的数据,它只会在Activity第一次创建时触发,我假设你的activity会恢复,它应该使用 onActivityResult
之类的东西。您应该使用 startActivityForResult
开始第二个 activity,在 onActivityResult
中,您将获得一个 intent
,您每次都可以从中读取最新数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data == null)
return;
pTrackVisitor_s = data.getStringExtra("trackVisitor");
pPosition_s = data.getStringExtra("position");
if (pTrackVisitor_s != null) {
pTrackVisitor = Integer.parseInt(pTrackVisitor_s);
pPosition = Integer.parseInt(pPosition_s);
} else {
pTrackVisitor = 0;
pPosition = 0;
}
}
您可以使用 intent
将 index
和其他所需数据传递给您的第二个 activity,如下所示
Intent data = new Intent();
data.putExtra("position", <yourClickedIndex>);
startActivityForResult(1234, SecondActivity.class);