【问题标题】:How to reload SimpleAdapter on onActivityResult如何在 onActivityResult 上重新加载 SimpleAdapter
【发布时间】:2013-12-07 05:53:19
【问题描述】:

我正在努力实现以下目标:

  1. 屏幕 1 显示来自服务器的列表数据
  2. 用户按下右上角的“+”按钮添加新项目
  3. 屏幕 2 显示带有文本字段
  4. 用户输入数据并点击保存
  5. 现在我想回到屏幕 1 并从服务器刷新列表,以便显示新添加的项目

我在实现上述第 5 点时遇到问题。这是我目前所拥有的:

我有一个AyncTask,如下所示:

public class MyActivity extends SherlockListActivity {
ArrayList<HashMap<String, String>> taskList;

//this grabs data from server and loads it in ArrayList
protected void loadList() {
    taskList = new ArrayList<HashMap<String, String>>();
    final RestAdapter restAdapter = new RestAdapter.Builder().setServer("http://10.0.2.2:8080").build();
    final TaskService apiManager = restAdapter.create(TaskService.class);
    final Task task = apiManager.getTask("someuser", task_id);

    for (Item item : task.getItems()) {
        String t_id = t.getId()+"";
        String name = t.getName();
        HashMap<String, String> map = new HashMap<String, String>();

        map.put("act_id", act_id);
        map.put("t_id", t_id);
        map.put("t_name", name);
        taskList.add(map);
    }
}

public void onCreate (Bundle b) {
  new LoadItems().execute();
}

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getTitle().equals("Create")) {
        Intent create = new Intent(getApplicationContext(), CreateTask.class);
        startActivityForResult(create, 1);
        return true;
    }
    return true;
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        //item got added now load again from server
        if (resultCode == RESULT_OK) {
            String result = data.getStringExtra("result");
            new UpdateItems.execute();
            adapter.notifyDataSetChanged();
        }
    }
}

class UpdateItems extends AsyncTask<String, String, String> {
    protected String doInBackground(String... args) {
        loadList();
        return null;
    }
}

class LoadItems extends AsyncTask<String, String, String> {
    protected String doInBackground(String... args) {
      loadList();
    }

    protected void onPostExecute(String file_url) {
        adapter = new SimpleAdapter(
                MyActivity.class, taskList,
                R.layout.list_item_rec, new String[] { "act_id", "t_id", "t_name"}, new int[] {
                R.id.act_id, R.id.t_id,R.id.t_name });
        setListAdapter(adapter);
    }
}

问题

如何从onActivityResult 中的服务器重新加载数据。基于上述,我正在做的是创建另一个 AynchTask 仅用于再次加载数据然后调用notifyDataSetChanged()。这似乎不起作用。

我的流程错了吗?有一个更好的方法吗?我被难住了……

【问题讨论】:

    标签: android android-intent android-listview


    【解决方案1】:

    您必须在UpdateItems onPostExecute() 方法中重新加载数据..因为您正在AsynchTask 中加载数据,它会在另一个线程中加载数据并更新ListView 但当时未加载列表。 .so 像这样更改您的AsynchTask..

    class UpdateItems extends AsyncTask<String, String, String> {
        protected String doInBackground(String... args) {
            loadList();
            return null;
        }
    
        @Override
        protected void onPostExecute(String result) {
            adapter.notifyDataSetChanged();
        }
    }
    

    并在onActivityResult() 中删除这一行adapter.notifyDataSetChanged()

    【讨论】:

    • 这有助于解决问题。此外,现在我注意到,当我单击保存按钮在屏幕 2 上执行 POST 请求时,在 POST 方法之前调用要在屏幕 1 上显示回数据的 GET 请求(onActivityResult)。因此,我无法选择最近添加的项目。我应该如何解决这个问题?在实际意图完成处理之前,是否会调用onActivityResult?这是创建任务的样子:gist.github.com/Omnipresent/7837863
    • 您是否向 screen2 添加了任何意图标志 .. 之前调用了一些标志 onActivityResult ..检查一次..
    • 我使用的唯一标志是RESULT_OK。似乎问题在于,在 gist.github.com/Omnipresent/7837863 中,我正在new CreateItemTask(...).execute() 中进行 POST,然后立即返回意图。因此,由于CreateItemTask 在单独的线程中运行,POST 发生在返回意图之后。有没有办法解决这个问题?
    • 将此意图代码更改为您的 CreateItemTask 的 onPostExecute()
    • 但是我将如何访问setResult(),因为该方法是Activity 的一部分而不是AsyncTask?我需要将RESULT_OK 的结果设置回原来的活动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多