【发布时间】:2013-01-09 21:10:10
【问题描述】:
当用户关闭一个活动并返回到上一个活动时,我遇到了列表刷新问题。我发现这个问题很常见,但我无法解决。
我重写了 onResume 方法:
@Override
public void onResume() {
super.onResume();
populateList();
}
populateList() 是我用字符串列表填充 listView 的方法:
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,list);
listView.setAdapter(arrayAdapter);
问题是,当第二个活动关闭时,新项目会再次添加到 ListView 中,所以我将每个项目都翻了一番。就像它没有刷新一样。
如果我将 notifyDataSetChanged() 放在 onResume() 中,它会抛出 nullPointerException,因为第一次启动活动时,第一次启动活动时没有初始化适配器。
我不知道如何处理。
public class testActivity extends Activity {
private int id=1;
private ListView listView;
private CustomArrayAdapter arrayAdapter;
private ArrayList<String> list = new ArrayList<String>();
ArrayList<Item> objectList = new ArrayList<Item>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
@Override
public void onResume() {
super.onResume();
populateList();
}
private void populateList() {
try {
objectList = new GetAsyncTask(id).execute();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int size = objectList.size();
String name;
for (int i = 0; i < size; i++) {
name = objectList.get(i).getName();
list.add(name);
}
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,
list);
listView.setAdapter(arrayAdapter);
}
}
【问题讨论】:
-
保留一个成员变量来控制
ListView是否已经包含字符串。如果是这样,请不要致电populateList()。 -
问题在于
list,你是如何填充这个的? -
@Shelly - 但即使 ListView 包含字符串,我也需要调用 populateList()。我正在尝试刷新它。我不确定我是否理解你。
-
@ZdravkoVajudin:啊,对不起,我误会了。我会清除适配器,然后再次添加字符串。
-
@Sam - 我从设备中捕获 list_of_files 并将其放入 populateList() 中的列表中。然后我应用适配器。返回时,设备上的列表已更改,因此它再次执行相同操作并将其放入列表中。问题是在 ListView 中仍然有旧项目,而新项目只是在最后添加。所以它是重复的。
标签: android android-listview refresh android-activity onresume