I have a big problem and I have been searching on the web to have a good solution for this problem but I couldn't find any approach for this problem so I want help.
I need to use expandable list view which get data from server (JSON Array) and i have categories, GroupData
and its items, ChildData
. I don't know how to get the child data for each parent group... i need something like SimpleCursorTreeAdapter
but i didn't find anything.
This is what i reach for till now but it's not working so please help me:
static ArrayList<HashMap<String, String>> mapList =
new ArrayList<HashMap<String, String>>();
static ArrayList<HashMap<String, String>> catItemsList =
new ArrayList<HashMap<String, String>>();
static ArrayList<ArrayList<HashMap<String, String>>> ItemsList =
new ArrayList<ArrayList<HashMap<String, String>>>();
static ListView order_list;
static ExpandableListView order_items_list;
static SimpleAdapter adapter,ItemsAdapter;
protected void BindOrederItemList(final int order_id)
{
// TODO Auto-generated method stub
//select all categories from order items where order_id =??
//select items where category=??
JSONObject params = new JSONObject();
//int no_pepole=Integer.valueOf(noOfGest_txt.getText().toString());
try
{
// params.put("order_status",myStatus);
int rest_id=prefs.getInt("Rest_id", 0);
params.put("order_id", order_id);
params.put("lang_id", 1);
params.put("rest_id", rest_id );
//params.put("order_status", 0);
// params.put("noOfpepole",number_of_guest);
}
catch(Exception e)
{
e.printStackTrace();
}
String Url="http://192.168.3.113/mywebservices.php?op=GetOrderCategory";
GetNetworkData.OnPostExecuteListener listener=new GetNetworkData.OnPostExecuteListener()
{
@Override
public void onPostExecute(String result) {
// TODO Auto-generated method stub
if (result!=null)
{
try
{
catItemsList.clear();
JSONArray jArray = new JSONArray(result);
ArrayList<ArrayList<HashMap<String, String>>> list=new ArrayList<ArrayList<HashMap<String, String>>>();
// ArrayList<Integer> category=new ArrayList<Integer>();
for (int i = 0; i < jArray.length(); i++)
{
HashMap<String, String> Catmap = new HashMap<String, String>();
JSONObject e = jArray.getJSONObject(i);
id=e.getInt("order_id");
cat_name=e.getString("cat_name");
cat_id=e.getInt("cat_id");
Catmap.put("cat_id",String.valueOf(cat_id));
Catmap.put("cat_name", cat_name);
catItemsList.add(Catmap);
Log.i("Insid For Loop", "order ID "+order_id);
list= BindCatItems(cat_id, order_id);
Log.i("Insid For Loop", "Child size = "+list.size());
}
// Log.i("Insid For Loop", "Group size = "+catItemsList.size());
SimpleExpandableListAdapter expandListAdapter= new SimpleExpandableListAdapter(getActivity(),
catItemsList, R.layout.group_item,
new String[] {"cat_name"},new int[]{R.id.lbl_cat_group},
list, R.layout.category_row, new String[]{"item_name"}, new int[]{R.id.txt_category_row});
order_items_list.setAdapter(expandListAdapter);
// Log.i("Bind item", "CAT SIZE "+catItemsList.size());
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
};
try
{
GetNetworkData task = new GetNetworkData(Url,params,listener);
task.execute();
}
catch(Exception e)
{
e.printStackTrace();
}
}
protected ArrayList<ArrayList<HashMap<String, String>>> BindCatItems(int cat_id,int order_id)
{
// TODO Auto-generated method stub
JSONObject params = new JSONObject();
//int no_pepole=Integer.valueOf(noOfGest_txt.getText().toString());
try
{
// params.put("order_status",myStatus);
int rest_id=prefs.getInt("Rest_id", 0);
params.put("order_id", order_id);
params.put("lang_id", 1);
params.put("cat_id",cat_id );
//params.put("order_status", 0);
// params.put("noOfpepole",number_of_guest);
}
catch(Exception e)
{
e.printStackTrace();
}
String Url="http://192.168.3.113/mywebservices.php?op=GetOrderItems";
GetNetworkData.OnPostExecuteListener listener=new GetNetworkData.OnPostExecuteListener()
{
@Override
public void onPostExecute(String result) {
// TODO Auto-generated method stub
if (result!=null)
{
try
{
Log.i("log bind","Inside Bind Category items");
// catItemsList.clear();
mapList.clear();
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++)
{
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = jArray.getJSONObject(i);
int id=e.getInt("item_id");
if (id==0)
{
}
else
{
map.put("item_id",String.valueOf(e.getInt("item_id")));
map.put("oi_id", String.valueOf(e.getInt("oi_id")));
map.put("item_name", e.getString("item_name"));
map.put("quantity",String.valueOf( e.getString("quantity")));
map.put("price", String.valueOf("price"));
mapList.add(map);
}
}
ItemsList.add(mapList);
// Log.i("Bind Item Order", "CAT SIZE "+catItemsList.size());
/* ItemsAdapter=new SimpleAdapter(getActivity(), catItemsList,
R.layout.list_item,
new String[] {"item_name"},
new int[]{R.id.list_item_title});
*/
// Log.i("Add Section","ItemsAdapter count= "+ItemsAdapter.getCount());
//order_list.setAdapter(adapter);
//adapter.notifyDataSetChanged();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
};
try
{
GetNetworkData task = new GetNetworkData(Url,params,listener);
task.execute();
}
catch(Exception e)
{
e.printStackTrace();
}
return ItemsList;
}
According to documentation, SimpleExpandableListAdapter is for static data. What is happening here is probably that your methods are returning before the data is fetched and the listener passed to the AsyncTask is called after the adapter has already been created.
So, the first thing I'd recommend to try is fetch the data first, and once the two listeners are executed ( by checking your own defined boolean flags or lists' lengths ), define the adapter and pass it to the ListView.