Android适配器 notifyDataSetChanged() 不起作用?

10

我正在编写一个应用程序,需要从用户那里获取输入,将其传递给服务器,服务器返回一个JSON字符串,然后在ListView中显示其解析后的内容。目前,我是通过扩展AsyncTask来实现这一点:

//stripped down version
public class main extends ListActivity {

ArrayList<String> listItems = new ArrayList<String>();
ArrayAdapter<String> adapter;
final EditText input = (EditText)findViewById(R.id.input);


input.addTextChangedListener(new TextWatcher() {    
    public void onTextChanged(CharSequence s, int start, int before, int count) {   
            if(!input.getText().toString().equals("")) {
            new GetDataTask().execute(input.getText().toString());
        }

    }   
});

private class GetDataTask extends AsyncTask<String, Void, ArrayList<String>> {
        protected ArrayList<String> doInBackground(String... query) {

        URL url = new URL("http://myserversaddressgoeshere.com/search/thequerygoeshere");
        URLConnection conn = url.openConnection();
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            ArrayList<String> items = new ArrayList<String>();
        //the code that parses the JSON goes here; it writes some strings to items
        return items;
        }

        protected void onPostExecute(ArrayList<String> items) {
            listItems = items;
        adapter.notifyDataSetChanged();
        }
}

}

这是我的第一篇帖子,所以如果我尝试将其变成代码块的尝试失败了,我提前道歉。

在onPostExecute方法中,在将listItems设置为items后,如果我打印出listItems的内容,它们正是我想要的。但是,由于某种原因,当从onPostExecute执行时,adapter.notifyDataSetChanged()似乎没有起到任何作用(当它从主线程调用时,它可以正常工作)。

如果有人知道发生了什么或如何解决它,我会非常感激。谢谢!

1个回答

21

你可以尝试这个

    protected void onPostExecute(ArrayList<String> items) {
        listItems.clear();
        listItems.addAll(items);
        adapter.notifyDataSetChanged();
    }

我希望你已经在做某件事情了。

adapter = new ArrayAdapter<String>(listItems);

糟糕,我忘记了那个声明。adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems); - Chris Leonard
那个方法可行;非常感谢!顺便问一下,你知道为什么 clear -> addAll -> notifyDSC 能够运行而我的方法不行吗? - Chris Leonard
6
当您声明ArrayAdapter时,传递了listItems的引用/指针,在onPostExecute中,您应该将值更新到该引用。litsItems=items只是为变量listItems分配一个新的引用/指针。我知道我的评论很混乱,但这是一个非常简单的概念。 - Samuel
所以这里是传递引用而不是对象;这很合理。谢谢! - Chris Leonard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接