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