Android:从第二个活动返回时刷新第一个活动中的ListView
当用户关闭一个活动并返回到上一个活动时,列表刷新有问题。我知道那个问题很常见,但我解决不了 我重写了onResume方法:Android:从第二个活动返回时刷新第一个活动中的ListView,android,android-listview,refresh,android-activity,onresume,Android,Android Listview,Refresh,Android Activity,Onresume,当用户关闭一个活动并返回到上一个活动时,列表刷新有问题。我知道那个问题很常见,但我解决不了 我重写了onResume方法: @Override public void onResume() { super.onResume(); populateList(); } populateList()是一种使用字符串列表填充listView的方法: arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,list
@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);
}
}
公共类测试活动扩展活动{
私有int id=1;
私有列表视图列表视图;
私人客户阵列适配器阵列适配器;
private ArrayList list=new ArrayList();
ArrayList objectList=新建ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
}
@凌驾
恢复时公开作废(){
super.onResume();
大众主义者();
}
私有void populateList(){
试一试{
objectList=新建GetAsyncTask(id).execute();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(超时异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
int size=objectList.size();
字符串名;
对于(int i=0;i
一开始,您就可以通过一个简单的条件语句轻松地解决这个问题,该语句仅在适配器不为null时执行该命令:
if (adapter != null) {
adapter.notifyDataSetChanged();
}
但在我看来,在更深层次上,您的代码可能会被重新分解,以提高效率,尽管不一定更实用
这样做:
private int id = 1;
private ListView listView;
private CustomArrayAdapter arrayAdapter;
private ArrayList<String> list = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
@Override
public void onResume() {
super.onResume();
populateList();
}
private void populateList() {
ArrayList<Item> objectList;
try {
objectList = new GetAsyncTask(id).execute();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
list.clear();
for (int i = 0; i <objectList.size(); i++) {
String name = objectList.get(i).getName();
list.add(name);
}
if (arrayAdapter == null) {
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item, list);
listView.setAdapter(arrayAdapter);
} else {
arrayAdapter.notifyDataSetChanged();
}
}
private int id=1;
私有列表视图列表视图;
私人客户阵列适配器阵列适配器;
private ArrayList list=new ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
}
@凌驾
恢复时公开作废(){
super.onResume();
大众主义者();
}
私有void populateList(){
ArrayList对象列表;
试一试{
objectList=新建GetAsyncTask(id).execute();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}捕获(超时异常e){
e、 printStackTrace();
}
list.clear();
对于(int i=0;i您只显示了应用程序代码的一部分,因此我在这里可能不正常,但我猜您正在使用光标返回list
变量,并使用list
创建数组适配器
如果您希望数据“新鲜”,为什么不在LoaderManager中使用游标Loader呢?LoaderManager有几个好处(比如将查询从UI线程中移出),并且LoaderManager在监视数据库的更改时为您做了一些繁重的工作
我发现有一篇博文很有帮助-
这都是假设您正在从数据库中提取数据
我从设备中捕获\u文件列表,并将其放入populateList()中的列表中。然后我应用适配器。返回时,设备上的列表会更改,所以它会再次执行相同的操作并将其放入列表中。问题是在ListView中,仍然有旧项,新项只是在末尾添加。因此它是重复的
一种基本的方法是在添加新数据之前调用list.clear()
。这将擦除旧数据并防止重复数据。(但是如果不查看相关代码,很难提供准确答案…)
添加
您应该将此代码添加到GetAsyncTask
中的onPostExecute()
方法中:
int size = objectList.size();
String name;
list.clear(); // or list = new ArrayList<String>();
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);
int size=objectList.size();
字符串名;
list.clear();//或list=newArrayList();
对于(int i=0;i
除非GetAsyncTask
嵌套在您的活动中,否则您需要将一些变量移动到GetAsyncTask
使用此方法。但是这种方法更好,因为它不会强制活动等待结果(这可能会导致“应用程序未响应”错误)问题在于,您在调用函数populateList()时没有首先清除列表。这样,populateList只会添加到以前的内容中
这将是一种正确的方式:
public void onResume() {
super.onResume();
list = new ArrayList<String>();
populateList(); }
这样,通过将适配器取出,您只需在onResume()函数中使用它
public void onResume(){
super.onResume();
列表=新的ArrayList();
}
保留一个成员变量,用于控制ListView
是否已包含字符串。如果已包含字符串,请不要调用populateList()
。问题在于列表
,如何填充此变量?@Shelly-但我需要调用populateList()即使ListView包含字符串。我正在尝试刷新它。我不确定我是否理解您的意思。@ZdravkoVajudin:啊,对不起,我误解了。我会清除适配器,然后再次添加字符串。@Sam-我从设备中捕获\u文件列表,并将其放入populateList()中的列表中
private ArrayList<String> list = new ArrayList<String>();
private ArrayList<String> 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);
}
return list;
}
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,
populateList());
listView.setAdapter(arrayAdapter);
public void onResume() {
super.onResume();
list = new ArrayList<String>();
}