后端 Android 工作室数据检索未显示在 ListView 中

Backendless Android studio data retrieval not showing in ListView

我在 Backendless 中设置了一个数据库,我的 Android Studio 应用程序正在访问它。连接成功并且项目名称已成功检索(根据日志),但我的列表视图未显示它们。我在本地添加了一个条目 "test" 并且正在显示。你能帮我吗?这是我的代码:

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


}

}

由于您是异步加载数据,因此您的 ListView 可能会在数据到达之前显示 - 因此您不会在那里看到它。要解决此问题,您应该在更新数据源列表后立即在 ListView 上调用 notifyDataSetChanged(),该列表位于 handleResponse 方法内。

因此您的代码应如下所示:

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


}