如何将项目附加到列表中?
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);
【讨论】:
以上是关于如何将项目附加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章