如何在Fragment中使用getSupportLoaderManager()方法?

5

我希望能够从API中加载信息到Fragment

我使用getSupportLoaderManager(),但是出现了一个错误:

无法解决方法:getSupportLoaderManager()

我查找资料后发现需要使用onActivityCreated(),但是我遇到了NullPointerException

您能帮助我解决这个问题吗?

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

public class Business extends Fragment implements LoaderManager.LoaderCallbacks<String> {

    ListView listView;   

    public Business() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_business, container, false);
        listView = view.findViewById(R.id.list_item);

        getSupportLoaderManager().initLoader(0, null, getContext()).forceLoad();
        return view;
    }

    @Override
    public Loader<String> onCreateLoader(int id, Bundle args) {
        return null;
    }

    @Override
    public void onLoadFinished(Loader<String> loader, String data) {
        if (data != null && !data.isEmpty())
            updateUI(data);
        else
            Toast.makeText(getContext(), "no internet", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLoaderReset(Loader<String> loader) {

    }

    private void updateUI(String data) {
        try {
            final ArrayList<ResultOfArtBusiness> results = new ArrayList<>();

            JSONObject root = new JSONObject(data);
            JSONObject secondObject = root.getJSONObject("response");

            JSONArray firstArray = secondObject.getJSONArray("results");
            for (int i = 0; i < firstArray.length(); i++) {
                JSONObject objectInArray = firstArray.getJSONObject(i);
                String webPublicationDate;
                if (objectInArray.has("webPublicationDate"))
                    webPublicationDate =   objectInArray.getString("webPublicationDate");
                else webPublicationDate = null;

                String webTitle;
                if (objectInArray.has("webTitle"))
                    webTitle = objectInArray.getString("webTitle");
                else webTitle = null;

                String webUrl;
                if (objectInArray.has("webUrl"))
                    webUrl = objectInArray.getString("webUrl");
                else webUrl = null;

                ResultOfArtBusiness resultOfArticle = new ResultOfArtBusiness(webTitle, webPublicationDate, webUrl);
                results.add(resultOfArticle);
            }

            NewsAdapterBusiness adapter = new NewsAdapterBusiness(getContext(), R.layout.item_design, results);

            listView.setAdapter(adapter);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

你说的“我搜索了onActivityCreated的用法”,是什么意思?我没有看到任何关于onActivityCreated()的代码,所以我不理解你问题中的这一部分。 - Bö macht Blau
我的意思是,我搜索了一下这个问题,发现我必须重写onActivityCreated()方法,在该方法中,我应该编写getLoaderManager().initLoader(0, null, getContext()).forceLoad(); 我写了这个,但是出现了空指针异常。 - ShahidaTalib
好的。如果你想找出为什么收到了 NPE,你必须分享来自 Logcat 的错误消息。然后也许就可以看到确切是什么为空。 - Bö macht Blau
java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'void android.support.v4.content.Loader.forceLoad()' - ShahidaTalib
你有任何解决方案吗? - Ram
显示剩余2条评论
1个回答

8

更新:2019年9月2日

Fragment中的getLoaderManager()已被弃用。

请使用

// LoaderManager#getInstance(LifecycleOwner) 
LoaderManager.getInstance(this) // this points to the Fragment

旧答案

问题在于,在从活动调用时,我们使用 getLoaderManager()getSupportLoaderManager(),但是当涉及到碎片时,您可以直接调用 getLoaderManager(),无需调用 getSupportLoaderManager(),并且在幕后,它将根据使用的碎片调用其相应版本的方法。


我遇到了一个错误,错误信息是“无法解析方法getLoaderFragment”。 - ShahidaTalib
正如我之前提到的,我们可以调用getLoaderManager方法,它适用于片段类型,并且对我而言可以正常工作。很难说为什么你无法解决这个问题。 - vikas kumar
支持片段中没有getSupportLoaderManager()方法。 - vikas kumar
我改用getLoaderManager(),但是出现了异常,异常信息如下:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.content.Loader.forceLoad()' on a null object reference,位于com.example.hp.newnewsapp.Fragment.Business.onCreateView(Business.java:49)。 - ShahidaTalib
我在Fragment类中使用LoaderManager.getInstance(this).initLoader(URL_LOADER, null, this); 但是我遇到了同样的空指针异常,有什么解决办法吗? - Ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接