I'm really new to android application creation and I'm using Android studio to work on my project. I'm fetching json result from my db and the fetched result are what I want, but I do not know how to let asynctask to finish before onCreate. My ListView are empty but I confirmed with debugger that my asynctask result values exist.
updated: I trace error to here:
public void populatedata(){
/**get back result from pref**/
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
String result =pref.getString("result", "null");
try{
Log.d("ADebugTag", "Value: "+result);
JSONObject person = new JSONObject(result);
JSONArray jsonMainNode = person.getJSONArray("result");
final int n = jsonMainNode.length();
ListView lv= (ListView)findViewById(R.id.listView1);
String[] from = new String[] {"id", "time"};
int[] to = new int[] {android.R.id.text1};
List<Map<String,String>> classList = new ArrayList<Map<String,String>>();
// for(int i = 0; i< n; i++){
//HashMap<String, String> map = new HashMap<String, String>();
// JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
// String id = jsonChildNode.getString("id");
// String schedule = jsonChildNode.getString("schedule");
// String time = jsonChildNode.getString("time");
// String output = schedule + time;
// classList.add(createchild(id,output));
// Log.d("ADebugTag", "Value before loop: "+classList);
// }
// Log.d("ADebugTag", "Value after loop: "+classList);
Log.d("ADebugTag", "Hi, Im here5");
for(int i = 0; i < 10; i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", "time" + i);
map.put("col_1", "col_1_item_" + i);
map.put("col_2", "col_2_item_" + i);
map.put("col_3", "col_3_item_" + i);
classList.add(map);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this,classList, android.R.layout.simple_list_item_1, from, to);
lv.setAdapter(simpleAdapter);
}
catch(JSONException e){
Toast.makeText(getApplicationContext(), "Error"+e.toString(), Toast.LENGTH_SHORT).show();
}
}
private HashMap<String, String>createchild(String id,String output){
HashMap<String,String> childNo = new HashMap<String,String>();
childNo.put(id,output);
Log.d("ADebugTag", "Hi, Im here4");
return childNo;
}
the // for loop is the one i wanna work it out, and my string result `is{"result":[{"id":"00000000001","schedule":"000001","time":"10:21:37"}]}`
updated: It's my mistake, I did not create a R.layout and textview for it, I learned to use custom adapter and create an external layout.
public class ViewClassActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_class);
/**prepare list**/
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
String id =pref.getString("userid", "null");
Log.d("ADebugTag", "Hi, Im here");
new fetchclass(this,id).execute(id);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void getdata(String result){
//save preferences
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("result", result); // Saving result string
Log.d("ADebugTag", "Hi, Im here3");
// Save the changes in SharedPreferences
editor.apply(); // apply changes
populatedata();
Log.d("ADebugTag", "Hi, Im here6");
}
public void populatedata(){
/**get back result from pref**/
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
String result =pref.getString("result", "null");
Log.d("ADebugTag",result);
try{
Log.d("ADebugTag", "Value: "+result);
JSONObject person = new JSONObject(result);
JSONArray jsonMainNode = person.getJSONArray("result");
final int n = jsonMainNode.length();
ListView lv= (ListView)findViewById(R.id.listView1);
String[] from = new String[] {"id", "schedule"};
int[] to = new int[] {R.id.textView20,R.id.textView21};
//List<Map<String,String>> classList = new ArrayList<Map<String,String>>();
ArrayList<HashMap<String,String>> classList = new ArrayList<>();
for(int i = 0; i< n; i++){
HashMap<String, String> hashMap = new HashMap<>();
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
String id = jsonChildNode.getString("id");
String schedule = jsonChildNode.getString("schedule");
String time = jsonChildNode.getString("time");
String output = schedule + time;
hashMap.put("id", id);
hashMap.put("schedule", output);
classList.add(hashMap);
//classList.add(createchild(id,output));
Log.d("ADebugTag", "Value before loop: "+classList);
}
CustomAdapter simpleAdapter = new CustomAdapter(this,classList, R.layout.list_view_item, from, to);
lv.setAdapter(simpleAdapter);
}
catch(JSONException e){
Toast.makeText(getApplicationContext(), "Error"+e.toString(), Toast.LENGTH_SHORT).show();
}
}
private HashMap<String, String>createchild(String id,String output){
HashMap<String,String> childNo = new HashMap<String,String>();
childNo.put(id,output);
Log.d("ADebugTag", "Hi, Im here4");
return childNo;
}
list_view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/textView20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="@dimen/activity_horizontal_margin"
android:text="Demo1"
android:textColor="#000" />
<TextView
android:id="@+id/textView21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="@dimen/activity_horizontal_margin"
android:text="Demo2"
android:textColor="#000"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textView20"
android:layout_toEndOf="@+id/textView20" />
</RelativeLayout>
custom adapter
public class CustomAdapter extends SimpleAdapter {
LayoutInflater inflater;
Context context;
ArrayList<HashMap<String, String>> arrayList;
public CustomAdapter(Context context, ArrayList<HashMap<String, String>> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
this.context = context;
this.arrayList = data;
inflater.from(context);
}
}
figured out my issue using this site, and thanks for everybody for the help:
You can't let the async task finish before onCreate. That's the entire point of an async task- it executes in parallel. Instead you should put up a loading screen (even just something as simple as an indeterminate progress bar) to show the user you're waiting for data, then load the data into the list in onPostExecute of the task.