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();
}
});
};