如何将项目附加到列表中?

Posted

技术标签:

【中文标题】如何将项目附加到列表中?【英文标题】:How to append an Item to a list? 【发布时间】:2013-12-24 12:17:42 【问题描述】:

我有一个从服务器加载的列表。以下是执行此操作的任务:

class LoadActivities extends AsyncTask <String, String, String> 
     protected String doInBackground(String ... args) 
         final RestAdapter restAdapter = new RestAdapter.Builder().setServer("http://10.0.2.2:8080").build();
         final MyService apiManager = restAdapter.create(MyService.class);
         final Activity activity = apiManager.getActivity("some user", act_id);
         //tasks in activity
         for (Tasks t : activity.getTasks()) 
               String r_id = t.getId()+"";
               String name = t.getName();
               HashMap<String, String> map = new HashMap<String, String>();

               map.put("activity_id", act_id);
               map.put("t_id", t_id);
               map.put("t_name", name);
               tasksList.add(map);
          
          return null;
     

    protected void onPostExecute(String file_url) 
        runOnUiThread(new Runnable() 
            public void run() 
                ListAdapter adapter = new SimpleAdapter(
                        TaskActivity.this, tasksList,
                        R.layout.list_item_rec, new String[]  "act_id", "t_id", "t_name", new int[] 
                        R.id.act_id, R.id.task_id,R.id.task_name );
                setListAdapter(adapter);
            
        );
    
 

所有这些都运行良好。但是,在另一个屏幕上,我在服务器上添加了一个项目,之后我回到这个屏幕再次显示列表。在回来的时候,我想刷新列表,以便它反映新添加的项目。

问题

我应该刷新整个列表吗?我已经尝试通过再次调用上面的类来做到这一点。像这样:

public boolean onOptionsItemSelected(MenuItem menuItem) 
    if (menuItem.getTitle().toString().equalsIgnoreCase("save")) 
        new CreateTask(this,activityName.getText().toString(), actId).execute();
        Intent returnIntent = new Intent();
        setResult(RESULT_OK, returnIntent);
        finish();
        return true;
    
    return true;

...回到这个屏幕

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == 1) 
        if (resultCode == RESULT_OK) 
            Log.d("This is result", result);
            new LoadActivities().execute();
        
    

问题在于它正在重新填充列表。这意味着我有每个活动的副本。我该如何解决这个问题?

有没有办法让我不必重新加载整个列表,而只需将一个项目添加到现有列表中?

【问题讨论】:

在List中添加新值后尝试adapter().notifyDataSetChanged() listView dynamic add item的可能重复 【参考方案1】:

首先,在“onPostExecute”方法中,不需要调用“runOnUiThread”,因为“onPostExecute”是在UI线程中运行的。

其次,如果你想刷新页面前面的ListView,你可以在前面使用“onActivityResult”,但是如果你的服务器数据被更新了,只需再次从服务器获取数据并更新你的数据集(列表),然后调用 adapter.notifyDataSetChanged()。

希望能帮到你!

【讨论】:

您好,感谢您的回答。它有助于。我正在关注您的第二点,但是,我正在使用 doInBackground() 方法从服务器获取数据。如果我尝试从onActivityResult 调用该方法,那么我会收到错误消息`应用程序可能在其主线程上做了太多工作。. What is a way to load data from server in onActivityResult` doInBackground()是在另一个线程(不是ui线程)中运行的,onActivityResult()是在ui线程中运行的,如果在ui线程中加载数据会报这个错误。 你可以在onPostExecute()中设置Result(intent,tag),然后在onActivityResult()方法中从intent中获取额外的数据。这将接近你的目标。【参考方案2】:

你应该和ArrayAdapter一起处理这个列表。

立即创建并设置 ArrayAdapter,然后根据需要向其中添加项目。您必须在适配器中覆盖 getView,但对于不会是复杂代码的简单视图。

一般结构如下:

onCreate(...) 
    // It's okay if the adapter is empty when you attach it to the ListView
    setListAdapter(new ArrayAdapter<ListItemType>(...));


onPostExecute(...) 
    // Once you've retrieved the list of items from the server, add them to
    // the adapter
    ArrayAdapter adapter = (ArrayAdapter) getListAdapter();
    adapter.add([items retrieved from server]);


onActivityResult(..., Intent data) 
    // Add the newly added item, either pass it back directly, or get the new 
    // list from the server and compare to see which item needs adding.
    // For simplicity, we'll assume it was passed back by the activity
    ListItemType newlyAddedItem = (ListItemType) data.getParcelableExtra("key");
    ArrayAdapter adapter = (ArrayAdapter) getListAdapter();
    adapter.add(newlyAddedItem);

【讨论】:

以上是关于如何将项目附加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用R [list]将列表的名称插入到列中

如何将项目附加到 Pandas 中不同列的列表中

如何将单个项目附加到其他可排序列表

如何将mysql内部连接结果从行分组到列

Pandas 将具有多个值的行数据合并到列的 Python 列表中

如何将 Vuetify v-menu 附加到可滚动列表中的父元素?