Reputation: 1163
SOLUTION: It was a case of having 2 different instances of WinnersFragment which caused the lv = getListView() to be null on the refresh.
My fragment list view works fine on load. However when I call public static void InitTask(String searchState). I get Content view not yet created at lv = getListView().
My goal is to just refresh the listview with new json.
I have tried calling getlistView in pre execute and I have tried using a new inittask.
I believe it has something to do with creating a new instance of the WinnersFragment but I am not sure.
I found this "Content view not yet Created" on Android Fragments but while I understand it hitting the main thread I do not understand how to implement the solution to see if that is my issue.
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();
}
}
}
LOG
12-04 13:01:48.156: E/AndroidRuntime(1367): FATAL EXCEPTION: main
12-04 13:01:48.156: E/AndroidRuntime(1367): java.lang.IllegalStateException: Content view not yet created
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
12-04 13:01:48.156: E/AndroidRuntime(1367): at com.xxx.xxx.WinnersFragment$InitTask.onPostExecute(WinnersFragment.java:123)
12-04 13:01:48.156: E/AndroidRuntime(1367): at com.xxx.xxx.WinnersFragment$InitTask.onPostExecute(WinnersFragment.java:1)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.os.AsyncTask.finish(AsyncTask.java:631)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.os.AsyncTask.access$600(AsyncTask.java:177)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.os.Looper.loop(Looper.java:137)
12-04 13:01:48.156: E/AndroidRuntime(1367): at android.app.ActivityThread.main(ActivityThread.java:4898)
12-04 13:01:48.156: E/AndroidRuntime(1367): at java.lang.reflect.Method.invokeNative(Native Method)
12-04 13:01:48.156: E/AndroidRuntime(1367): at java.lang.reflect.Method.invoke(Method.java:511)
12-04 13:01:48.156: E/AndroidRuntime(1367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
12-04 13:01:48.156: E/AndroidRuntime(1367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
12-04 13:01:48.156: E/AndroidRuntime(1367): at dalvik.system.NativeStart.main(Native Method)
xml
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false" />
Calling Fragment code
public class TabsFragmentActivity extends FragmentActivity implements
FragmentTabHost.OnTabChangeListener, OnClickListener {
blablabla
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnDismiss:
getSupportFragmentManager().popBackStackImmediate();
break;
case R.id.ibSearch:
LayoutInflater inflater = LayoutInflater.from(this);
final View textenter = inflater.inflate(R.layout.winners_list, null);
final EditText userinput = (EditText) textenter
.findViewById(R.id.etSearchState);
String searchState = userinput.toString();
WinnersFragment.InitTask(searchState);
break;
}
}
Upvotes: 1
Views: 3086
Reputation: 7256
Try to execute your background task inside onActivityCreated() method.
Upvotes: 1
Reputation: 17401
onCreateView
Returns a view that is displayed for this fragment as you are trying to access listview before returning this view you are getting that error.
Try doing what @Makario said or else get the list view reference in onCreateView by:
v = inflater.inflate(R.layout.winners_list, container, false);
context = getActivity().getApplicationContext();
listView=v.findViewById(R.id.list);
new InitTask().execute();
And use this listview object in your task.
Upvotes: 0
Reputation: 2117
As the error message indicates, your ListView's view hasn't yet been created. (You're calling it in onCreateView, and even though the method runs asynchronously, you're trying to access the ListView before it has been completely setup.)
Move the InitTask().execute() to either onViewCreated
or onActivityCreated
instead.
Upvotes: 0