Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:从第二个活动返回时刷新第一个活动中的ListView_Android_Android Listview_Refresh_Android Activity_Onresume - Fatal编程技术网

Android:从第二个活动返回时刷新第一个活动中的ListView

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

当用户关闭一个活动并返回到上一个活动时,列表刷新有问题。我知道那个问题很常见,但我解决不了

我重写了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);
    }
}
公共类测试活动扩展活动{
私有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>();
    }