【问题标题】:Why does my TaskLoader only stores the last data?为什么我的 TaskLoader 只存储最后的数据?
【发布时间】:2026-02-15 16:05:02
【问题描述】:

我的代码流程有问题。请大家帮忙:(

好的,流程是这样的。第一个活动加载recyclerview,它存储ArrayListdata。 Arraylist 的数据包含有关 Premise 的信息,它从网站的 API 检索。它使用GET 方法。

好的,接下来当我从recyclerview 中选择一个项目时,它会将我带到next Activity,我将输入integer。然后,当它返回到first Activity 时,它传递integer 值和recyclerview 项的indexrecyclerview 使用 index 更新项目并将 integer 值存储在项目中。

所以,我的问题是:当我重复从recyclerview 中选择一个项目并输入一个整数的过程时,第一个活动只存储最新数据。上一个项目不见了。

我到底哪里做错了?我是移动应用程序开发的新手。请帮忙。我真是一头雾水。

这是第一个活动。它被称为 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) {
    }
}

如果您需要更多编码部分,请告诉我。我会分享它们。

【问题讨论】:

    标签: android arraylist android-recyclerview asynctaskloader


    【解决方案1】:

    首先,你不应该读取onCreate中的数据,它只会在第一次创建活动时触发,我假设你的活动将被恢复,它应该使用onActivityResult之类的东西。您应该使用startActivityForResult 开始第二个活动,在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;
            }
        }
    

    您可以使用intentindex 和其他所需数据传递给您的第二个活动,如下所示

    Intent data = new Intent();
    data.putExtra("position", <yourClickedIndex>);
    startActivityForResult(1234, SecondActivity.class);
    

    【讨论】:

      最近更新 更多