Android 尚未在刷新列表片段中创建内容视图

Android 尚未在刷新列表片段中创建内容视图,android,android-fragments,Android,Android Fragments,解决方案: 这是一个WinnersFragment有两个不同实例的情况,导致刷新时lv=getListView()为空 我的片段列表视图在加载时工作正常。但是,当我调用publicstaticvoidinittask(stringsearchstate)时。我在lv=getListView()处获取尚未创建的内容视图 我的目标是用新的json刷新listview 我已尝试在预执行中调用getlistView,并尝试使用新的inittask。 我相信这与创建WinnersFragment的新实例有

解决方案: 这是一个WinnersFragment有两个不同实例的情况,导致刷新时lv=getListView()为空

我的片段列表视图在加载时工作正常。但是,当我调用publicstaticvoidinittask(stringsearchstate)时。我在lv=getListView()处获取尚未创建的内容视图

我的目标是用新的json刷新listview

我已尝试在预执行中调用getlistView,并尝试使用新的inittask。
我相信这与创建WinnersFragment的新实例有关,但我不确定

我发现了这一点,但虽然我理解它击中了主线程,但我不理解如何实现解决方案,看看这是否是我的问题

 public class WinnersFragment extends ListFragment {
private static String URL = "http://www.xxx.com/RichardsTesting/winners.json";

Context context;
Winners_List_Adapter adapter;
static View v;
ListView lv;
ArrayList<String> alFName;
private ProgressDialog pd;
private static final String TAG_ID = "id";
private static final String TAG_FNAME = "fname";
private static final String TAG_STATE = "state";
private static final String TAG_CODE = "code";
private static final String TAG_AMOUNT = "amount";

ArrayList<HashMap<String, String>> winnersList;

JSONArray winners = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.winners_list, container, false);
    context = getActivity().getApplicationContext();
    new InitTask().execute();

    return v;
}

@Override
public void onDestroy() {
    lv.setAdapter(null);
    super.onDestroy();
}

protected class InitTask extends AsyncTask<Context, Integer, String> {
    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(v.getContext());
        pd.setTitle("Updating...");
        pd.setMessage("Please wait.");
        pd.setCancelable(false);
        pd.setIndeterminate(true);
        pd.show();
    }

    @Override
    protected String doInBackground(Context... params) {
        // Hashmap for ListView
        winnersList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        String json = jParser.getJSONFromUrl(URL);
        try {
            JSONArray json1 = new JSONArray(json);

            // looping through All Contacts
            for (int i = 0; i < json.length(); i++) {
                JSONObject c = json1.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String fName = c.getString(TAG_FNAME);
                String state = c.getString(TAG_STATE);
                String code = c.getString(TAG_CODE);
                String amount = c.getString(TAG_AMOUNT);

                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_FNAME, fName);
                map.put(TAG_STATE, state);
                map.put(TAG_CODE, code);
                map.put(TAG_AMOUNT, amount);

                // adding HashList to ArrayList
                winnersList.add(map);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return "COMPLETE!";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // selecting single ListView item
        lv = getListView();
        if (pd != null) {
            pd.dismiss();
        }
        setListWinners();
    }
}

public void setListWinners() {
    adapter = new Winners_List_Adapter(this.getActivity(), winnersList);
    lv.setAdapter(adapter);
}

public static void InitTask(String searchState) {
    if (searchState !=null) {
    URL = URL+"?state="+searchState;
    WinnersFragment search = new WinnersFragment();
    search.new InitTask().execute();
    }
}
}
xml


如错误消息所示,ListView的视图尚未创建。(您在onCreateView中调用它,即使该方法异步运行,您也试图在ListView完全设置之前访问它。)


将InitTask().execute()移到创建的视图上或创建的活动上。

如错误消息所示,您的ListView视图尚未创建。(您在onCreateView中调用它,即使该方法异步运行,您也试图在ListView完全设置之前访问它。)

onCreateView  
将InitTask().execute()移到创建视图时的
onview
或创建活动时的
onActivityCreated

onCreateView  
在返回此视图之前,当您试图访问listview时,返回此片段显示的视图。如果您遇到此错误,则返回此视图

尝试执行@Makario所说的操作,或者通过以下方式获取onCreateView中的列表视图引用:

 v = inflater.inflate(R.layout.winners_list, container, false);
 context = getActivity().getApplicationContext();
 listView=v.findViewById(R.id.list);
 new InitTask().execute();
并在任务中使用此listview对象

在返回此视图之前,当您试图访问listview时,返回此片段显示的视图。如果您遇到此错误,则返回此视图

尝试执行@Makario所说的操作,或者通过以下方式获取onCreateView中的列表视图引用:

 v = inflater.inflate(R.layout.winners_list, container, false);
 context = getActivity().getApplicationContext();
 listView=v.findViewById(R.id.list);
 new InitTask().execute();

并在任务中使用此listview对象。

尝试在onActivityCreated()方法中执行后台任务


尝试在onActivityCreated()方法中执行后台任务


这并不能解决问题。onCreateView中的InitTask().execute()工作正常。我需要从publicstaticvoidinittask(stringsearchstate)再次调用它,我假设您已经尝试过这个解决方案,那么?问题是,在调用该方法之前,尚未完全设置视图。您正在尝试在ListView准备就绪之前访问它。如果要尝试调试该问题,请将getListView()调用包装在一个If语句中:If(isAdded()){lv=getListView();}else{System.out.println(“调用太早”)},该语句不会解决该问题。onCreateView中的InitTask().execute()工作正常。我需要从publicstaticvoidinittask(stringsearchstate)再次调用它,我假设您已经尝试过这个解决方案,那么?问题是,在调用该方法之前,尚未完全设置视图。您正在尝试在ListView准备就绪之前访问它。如果要尝试调试该问题,请将getListView()调用包装在一个If语句中:If(isAdded()){lv=getListView();}else{System.out.println(“调用太早”)}如果我将InitTask().execute()移动到onViewCreated或onActivityCreated,如何使用公共静态void InitTask(字符串searchState)中的新url刷新它{if(searchState!=null){URL=URL+“?state=“+searchState;WinnersFragment search=new WinnersFragment();search.new InitTask().execute();}您不应该创建WinnersFragment的新对象,而应该找到一种方法来使用同一对象创建新的InitTask对象。不要将该函数设为静态函数,并在相同的WinnersFragment对象上调用它,例如:public void InitTask(String searchState){if(searchState!=null){URL=URL+“?state=“+searchState;new InitTask().execute();}}}问题是调用该函数的按钮在我的选项卡Fragment上,它扩展了FragmentActivity。因此我无法从WinnerFragments调用它。您可以演示该代码吗?如果我移动InitTask(),请尝试持久化引用或使用回调系统刷新数据。execute()要创建onViewCreated或onActivityCreated,如何使用公共静态void InitTask(字符串searchState)中的新url刷新它{if(searchState!=null){url=url+“?state=“+searchState;WinnersFragment search=new WinnersFragment();search.new InitTask().execute();}您不应该创建WinnersFragment的新对象,而应该找到一种方法来使用同一对象创建新的InitTask对象。不要将该函数设为静态函数,并在相同的WinnersFragment对象上调用它,例如:public void InitTask(String searchState){if(searchState!=null){URL=URL+“?state=“+searchState;new InitTask().execute();}}}问题是调用该函数的按钮在我的选项卡Fragment上,该选项卡扩展了FragmentActivity。因此我无法从WinnerFragments调用它。您可以演示该代码吗?尝试如何持久化引用或使用回调系统刷新数据
 v = inflater.inflate(R.layout.winners_list, container, false);
 context = getActivity().getApplicationContext();
 listView=v.findViewById(R.id.list);
 new InitTask().execute();