Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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
Java 调用notifyDataSetChanged后Android ListView未更新_Java_Android_Android Listview_Android Asynctask - Fatal编程技术网

Java 调用notifyDataSetChanged后Android ListView未更新

Java 调用notifyDataSetChanged后Android ListView未更新,java,android,android-listview,android-asynctask,Java,Android,Android Listview,Android Asynctask,我有一项活动,我是这样开始的: public class MyProblemsActivity extends ListActivity { String[] PROBLEMS = new String[] {"One", "Two", "Three" }; ArrayAdapter adapter; /** Called when the activity is first created. */ @Override public vo

我有一项活动,我是这样开始的:

public class MyProblemsActivity extends ListActivity 
{
    String[] PROBLEMS = new String[] {"One", "Two", "Three" };
    ArrayAdapter adapter;       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        adapter = new ArrayAdapter<String>(this,R.layout.my_problems, PROBLEMS);

        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
@Override
protected void onPostExecute(String result) 
{       
    PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
    adapter.clear();
    adapter.addAll(PROBLEMS);
    adapter.notifyDataSetChanged();
}
@Override
protected void onPostExecute(String result) 
{                  

  runOnUiThread(new Runnable() {

    @Override
    public void run() {
            PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
            adapter.notifyDataSetChanged();
    }
});
};
但屏幕不会更新。我在这里做错了什么?如何让屏幕用新值更新

谢谢

现在正在发生的事情

PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
问题
正在获取对
新的
字符串数组对象的引用…因此旧引用保持原样(未更改)

要更正它,请使用以下命令:

PROBLEMS.clear();
List<String> newlist = new ArrayList<String>();
newlist.add(..);
..
PROBLEMS.addAll(newlist);
adapter.notifyDataSetChanged();
PROBLEMS.clear();
List newlist=newarraylist();
newlist.add(…);
..
PROBLEMS.addAll(newlist);
adapter.notifyDataSetChanged();
这样,新字符串将只添加到问题指出的现有数组引用中


注意:我已经提到使用arraylist of string而不是string[],要使用它的clear()、addAll()功能,您可以根据自己的使用修改string[]的功能。

如果您想要一个更简单的答案,您只需将代码更改为如下所示:

public class MyProblemsActivity extends ListActivity 
{
    String[] PROBLEMS = new String[] {"One", "Two", "Three" };
    ArrayAdapter adapter;       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        adapter = new ArrayAdapter<String>(this,R.layout.my_problems, PROBLEMS);

        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
@Override
protected void onPostExecute(String result) 
{       
    PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
    adapter.clear();
    adapter.addAll(PROBLEMS);
    adapter.notifyDataSetChanged();
}
@Override
protected void onPostExecute(String result) 
{                  

  runOnUiThread(new Runnable() {

    @Override
    public void run() {
            PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
            adapter.notifyDataSetChanged();
    }
});
};

这将更改ArrayAdapter的内容,使其包含新字符串[]中的字符串,然后通知ListView ArrayAdapter包含新内容。这将导致ListView更新并显示您的新字符串。

我听说您通过异步回调更新了列表。我的情况也是如此。我去了在UI线程中运行它,突然它像预期的那样工作了(如果不这样做,通常会出现异常。在这里,它只是不刷新列表。)在我看来,其他答案只是解决办法

因此,如下更改代码:

public class MyProblemsActivity extends ListActivity 
{
    String[] PROBLEMS = new String[] {"One", "Two", "Three" };
    ArrayAdapter adapter;       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        adapter = new ArrayAdapter<String>(this,R.layout.my_problems, PROBLEMS);

        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
@Override
protected void onPostExecute(String result) 
{       
    PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
    adapter.clear();
    adapter.addAll(PROBLEMS);
    adapter.notifyDataSetChanged();
}
@Override
protected void onPostExecute(String result) 
{                  

  runOnUiThread(new Runnable() {

    @Override
    public void run() {
            PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
            adapter.notifyDataSetChanged();
    }
});
};