在我的活动中,有一个包含文本文件行的列表视图。为了填充此列表视图,我在onCreate(Bundle savedInstanceState)方法中创建了一个arrayadapter。如果文件中有行,则列表视图将填充项目。 arrayadapter部分如下所示:
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(现在我们在onCreate(Bundle savedInstanceStat)方法之外,我在文本文件中写了一行。现在一切正常。如果我退出并重新打开应用程序,新行出现在listview。但是在添加新行后列表视图没有刷新,所以在“case R.id.Menu1:”部分的末尾。
因此,在向文件添加一行后,我想通过读取文件中的行到数组来刷新listview,然后用该数组填充listview。问题是我不能这样做,即使我把ArrayAdapter<String> adapter1;
行放在onCreate()方法之外,其中声明了其他数组和变量。
它没有看到列表视图( lv1无法解析)。 如果我定义其他变量所在的ListView(ListView lv1;),那么程序的整个部分都无法正常工作。
我还需要在填充之前用adapter1.clear();
或sg清空listview(适配器?)。
欢迎任何想法。
答案 0 :(得分: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
)中使用的数组。
假设您有一种方法可以添加列表中尚未包含的最近读取的行。将行添加到ArrayList
中使用的ListAdapter
后,您应该调用notifyDatasetChanged
方法,以便可视化ListView
中的新项目:
private void addLinesToList(final String... newLines)
{
assignArr0.addAll(Arrays.asList(newLines));
adapter1.notifyDataSetChanged();
}
如果您每次更改时都在阅读整个文件,并从顶部填充(不仅仅是插入新行),您必须首先删除列表中的所有元素,因此{{1方法应该是:
addLinesToList