【问题标题】:On orientation change LoaderManager calls onLoadFinished but list not set在方向更改时 LoaderManager 调用 onLoadFinished 但未设置列表
【发布时间】:2023-03-09 09:13:01
【问题描述】:

我一直在学习 Android 加载器,并尝试使用 AsyncTaskLoader 来实现。

我已经非常成功了,这让这变得更加烦人:P

我的onLoadFinished函数如下:

@Override
public void onLoadFinished(Loader<JSONArray> arg0, JSONArray data) {
    // TODO Auto-generated method stub
      setProgressBarIndeterminateVisibility(false);
      mLoadedData = data;
    //Log.d("here","dosomething");
    //Toast.makeText(getApplicationContext(), "msg msg", Toast.LENGTH_LONG).show();

     //Log.d("json",mLoadedData.toString());

    Fragment f = getSupportFragmentManager().findFragmentByTag("pub_list");
    ((BP_Fragment) f).set_result(mLoadedData);


}

我的片段中的set_result函数如下:

public void set_result(JSONArray data) {
    // TODO Auto-generated method stub
    //Toast.makeText(getSherlockActivity(), "set result is called..", Toast.LENGTH_SHORT).show();


    Log.d("pubs",data.toString());
    for (int i = 0; i <data.length(); i++){
        Log.d("string","here");
        JSONObject c;
        try {
            c = data.getJSONObject(i);


        String id = c.getString("pid");
        String name = c.getString("name");
        String town = c.getString("town");
        String county = c.getString("county");
        //Double score=c.getDouble(criteria);
        //Log.d("score",score);
        //HashMap<String, String> map = new HashMap<String, String>();


        pubs.add(new PubListDetails(id,name,town,county,1.0,"pub"));
        //map.put(TAG_PID, id);
        //map.put(TAG_NAME, name);

        //productsList.add(map);

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }



     PubListAdapter adapter = new PubListAdapter(getSherlockActivity(), pubs);
     // Toast.makeText(getSherlockActivity(), "This is called", Toast.LENGTH_SHORT).show();


      setListAdapter(adapter);

}

我使用 LoaderManager 调试器来检查加载器是否被保留。它是。我已经使用控制台日志从 set_result 函数中输出我的数据 - 每次方向变化时数据都在那里。 IE 一切都被调用,一切都按照建议传递 YET set_adapter 仅在第一次将数据设置到列表中, 当它被保留的加载器调用时,不会。

为什么? :P 我很困惑。

谢谢

【问题讨论】:

  • 您是否尝试在适配器上调用notifyDataSetChanged()
  • 数据集没有改变,只是在旋转点还没有完成加载。旋转后,我看到加载完成但 setListAdapter 不起作用..

标签: android android-asynctask android-loadermanager android-loader


【解决方案1】:

所以我解决了这个问题。

在我的加载器活动中,我在 onCreate 中创建了一个片段,其中包含我的列表和我的 set_result 函数。

虽然当我在改变方向时重新创建活动时加载器被成功保留,但它正在创建另一个具有相同标签的片段,而不是使用保留的片段。

因此,当我调用我的 set_result 函数时,我假设它正在查找我的初始片段并在其上设置列表。

当您创建两个具有相同标签的片段时,我不确定 100% 片段是如何工作的 - 我只能假设重新创建的版本放置在我最初的版本之上,因此将其隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多