I have a database set up in Backendless and my Android Studio application is accessing it. The connection is successful and the names of the items are successfully retrieved (as per the log) but my list view is not showing them. I added an entry "test" locally and this is being shown. Can you help? Here is my code:
public class ListItems extends Activity {
ListView foodListView;
ArrayList<String> myFood;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set up listView
setContentView(R.layout.list_items);
foodListView = (ListView)findViewById(R.id.foodListView);
myFood = new ArrayList();
myFood.add("test");
//connect to database
Backendless.setUrl(Defaults.SERVER_URL);
Backendless.initApp(getApplicationContext(),
Defaults.APPLICATION_ID,
Defaults.API_KEY);
final IDataStore<Map> tableQuery = Backendless.Data.of( "FoodList" );
final DataQueryBuilder queryBuilder = DataQueryBuilder.create();
queryBuilder.setWhereClause( "Section = 'Dairy'" );
queryBuilder.setSortBy( "name" );
Backendless.Data.of( "FoodList" ).find( queryBuilder,
new AsyncCallback<List<Map>>()
{
@Override
public void handleResponse(List<Map>response ){
Iterator<Map> itr = response.iterator();
while(itr.hasNext()) {
Map<String, Object> contact = (Map<String, Object>) itr.next();
String name = (String) contact.get("Name");
myFood.add(name);
}
//test to show items retrived
for(String aa:myFood){
System.out.println("MYAPP " +aa);
}
}
@Override
public void handleFault( BackendlessFault fault )
{
Log.e("MYAPP", "Server reported an error - " + fault.getMessage());
}
});
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myFood);
foodListView.setAdapter(arrayAdapter);
}
}
Since you're loading data asynchronously, your ListView
may be displayed earlier than the data has arrived - thus you won't see it there. To tackle this you should call notifyDataSetChanged()
on a ListView
right after you've updated the data source list, which is inside of handleResponse
method.
So your code should look like the following:
public class ListItems extends Activity {
ListView foodListView;
ArrayList<String> myFood;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set up listView
setContentView(R.layout.list_items);
foodListView = (ListView)findViewById(R.id.foodListView);
myFood = new ArrayList();
//connect to database
Backendless.setUrl(Defaults.SERVER_URL);
Backendless.initApp(getApplicationContext(), Defaults.APPLICATION_ID, Defaults.API_KEY);
final IDataStore<Map> tableQuery = Backendless.Data.of( "FoodList" );
final DataQueryBuilder queryBuilder = DataQueryBuilder.create();
queryBuilder.setWhereClause( "Section = 'Dairy'" );
queryBuilder.setSortBy( "name" );
Backendless.Data.of( "FoodList" ).find( queryBuilder,
new AsyncCallback<List<Map>>()
{
@Override
public void handleResponse(List<Map>response ){
Iterator<Map> itr = response.iterator();
while(itr.hasNext()) {
Map<String, Object> contact = (Map<String, Object>) itr.next();
String name = (String) contact.get("Name");
myFood.add(name);
}
// new data has been now added to the list - need to update view
foodListView.notifyDataSetChanged();
}
@Override
public void handleFault( BackendlessFault fault )
{
Log.e("MYAPP", "Server reported an error - " + fault.getMessage());
}
});
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myFood);
foodListView.setAdapter(arrayAdapter);
}