【问题标题】:Backendless Android studio data retrieval not showing in ListView后端 Android Studio 数据检索未显示在 ListView 中
【发布时间】:2017-12-19 14:06:53
【问题描述】:

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

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


}

}

【问题讨论】:

  • 我尝试了 arrayAdapter.notifyDataSetChanged() 但它不起作用我仍然只得到一个显示“测试”的列表。是否与在我设置视图时检索数据尚未完成有关?
  • 绝对是。你在哪里打电话给.notifyDataSetChanged()
  • 您好,很抱歉延迟回复。我在 foodListView.setAdapter(arrayAdapter) 之前和之后调用了 .notifyDataSetChanged() 但似乎都不起作用。我做错地方了吗?
  • 您应该在数据更新后立即调用,在您的情况下是在 handleResponse 方法内。

标签: listview android-studio backendless


【解决方案1】:

由于您异步加载数据,您的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);


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多