0

我有一个记录声音的应用程序。录制完声音后,系统会要求用户 (AlertDialog) 重命名录制的文件。文件重命名后,文件名添加到.txt文档中(存储在Android/data/package_name中)。在第二个活动中,有一个列表视图,项目从这个 .txt 文件添加到列表视图。现在,在您可能知道我的应用程序是如何工作的之后,问题就来了。

在第二个活动中,我添加了一个 OnLongClickListener。如果用户长按 ListView 中的某个项目,它会打开一个带有“重命名”选项的菜单。用户输入新名称并按 OK 后,文件名以及该 .txt 文件中的文件名都会更改。

问题是 ListView 没有更新,所以我需要重新启动活动才能更新它。我尝试了很多东西,但没有任何效果。

我尝试了几种不同的 updateListView 方法:

public void updateListView(){
    ViewGroup vg = (ViewGroup)findViewById(R.id.mainListView);
    vg.invalidate();
}

和这个:

public void updateListView(){
    listAdapter.clear();
    listAdapter.addAll(recordedFilesArray);
    listAdapter.notifyDataSetChanged();
}

我还尝试在单击按钮时调用 listAdapter.notifyDataSetChanged() ,基本上我能想到的所有地方都没有任何效果。查看文件已重命名的唯一方法是重新启动活动。

无法在单击按钮时重新启动活动,因为活动在选项卡布局内,如果重新启动,它会自动打开活动 #1,而这是活动 #2。

实现列表适配器:

listAdapter = new ArrayAdapter<String>(this, com.whizzappseasyvoicenotepad.R.layout.simplerow, recordedFilesArray);
listView.setAdapter(listAdapter);

recordedFilesArray 是从 .txt 文件中添加名称的 ArrayList

4

4 回答 4

0

尝试更新源Array中的文本ListView。所以,如果你有你ArrayList<String>的项目ListView,那么String在该数组中更新并调用listAdapter.notifyDataSetChanged().

于 2013-08-21T09:01:33.497 回答
0

你需要清除列表视图适配器中使用的行项目。尝试这个,

recordedFilesArray.clear();
于 2013-08-21T09:03:40.203 回答
0

尝试在 uithread 中运行您的代码,也许您正在从另一个线程调用此函数:

runOnUiThread(new Runnable() {

@Override
public void run() {
      *your code of update here
}

});

于 2013-08-21T09:07:59.400 回答
0

如果您在 LogCat 的某处看到以下错误:

E/AndroidRuntime(9026): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸它的视图

那么这意味着您正在notifyDataSetChanged()从后台线程调用。

请注意,notifyDataSetChanged() 必须从 UI 线程调用。

您可以通过将对它的调用包装在Runnable您发布到 UI 线程的 a 中来做到这一点,如下所示:

YOURACTIVITY.runOnUiThread(new Runnable() {

        @Override
        public void run() {
             listAdapter.notifyDataSetChanged();
        }
    });
}

显然将 YOURACTIVITY 替换为对您的Activity.

于 2013-08-21T09:47:06.980 回答