2011-05-19 59 views
0

在我的活动中有一个包含文本文件行的列表视图。为了填充这个列表视图,我在onCreate(Bundle savedInstanceState)方法中创建了一个arrayadapter。如果文件中有行,则列表视图会填充项目。一个ArrayAdapter部分看起来是这样的:。Android的列表视图适配器问题

final ListView lv1 = (ListView) findViewById(R.id.ListView01); 
ArrayAdapter<String> adapter1; 
    adapter1 = new ArrayAdapter<String>(Main.this,R.layout.list_black_text,R.id.list_content, assignArr0); 
    lv1.setAdapter(adapter1); 
    adapter1.notifyDataSetChanged(); 

然后通过点击菜单条1/1(所以现在我们是的onCreate(捆绑savedInstanceStat外)方法我写在文本文件中的一行现在一切工作正常,如果我退出并重新打开应用程序,新行出现在列表视图中,但是在添加新行后未刷新列表视图,因此在“case R.id.Menu1:”部分末尾

因此,添加一行行到文件我想刷新列表视图通过读取文件中的行到数组,然后填充该列表视图与问题是我不能这样做,即使我把ArrayAdapter<String> adapter1;行在onCreate()方法之外其中声明了其他数组和变量。

它没有看到列表视图(lv1无法解析)。 如果我定义其他变量的ListView(ListView lv1;)这个程序的整个部分都不起作用。

我还需要在填充它之前清空listview(适配器?)adapter1.clear();或sg。 欢迎任何想法。

回答

0

如果你需要这些变量是全球性的,应声明它们作为

private final ArrayList<String> assignArr0 = new ArrayList<String>(); 
private ListView lv1; 
private ArrayAdapter<String> adapter1; 

@Override 
public void onCreate(Bundle icicle) 
{ 
    lv1 = (ListView) findViewById(R.id.ListView01); 
    adapter1 = new ArrayAdapter<String>(Main.this,R.layout.list_black_text, 
     R.id.list_content, assignArr0); 
    lv1.setAdapter(adapter1); 
} 

应设置适配器的ListView只有一次,你的活动onCreate方法内部,notifiyDatasetChanged应在对列表进行更改后调用(在您的ListAdapter中使用的数组)。

假设您有一种方法来添加最近读取的行,但尚未包含在列表中。加入线在ListAdapter使用的ArrayList后,你应该调用notifyDatasetChanged方法,以可视化的ListView新项目:

private void addLinesToList(final String... newLines) 
{ 
    assignArr0.addAll(Arrays.asList(newLines)); 
    adapter1.notifyDataSetChanged(); 
} 

如果你每次改变时间阅读整个文件,并填充它从顶部(不只是插入新行),您必须首先删除列表中的所有元素,所以addLinesToList方法的第一行应该是:

assignArr0.clear(); 
+0

谢谢,这也是不错的。我也用我的方式解决了这个问题:[LINK] http://stackoverflow.com/questions/6102060/android-listview-refresh [/ LINK] – erdomester 2011-05-24 22:09:11