listviewandroid-studiobackendless

Backendless Android studio data retrieval not showing in ListView


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);


}

}


Solution

  • 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);
    
    
    }