1

我不确定如何解释这个问题,但我会尽力而为。我有一个录制声音的应用程序,完成录制后,您必须重命名文件,然后将文件添加到另一个活动的列表视图中。

我有选项卡布局,所以将文件添加到列表视图有点复杂,我是这样做的:

录制活动:

if (getParent() instanceof FileNameProvider) {
    ((FileNameProvider) getParent()).onNewFileName(newFileName);
}

选项卡布局活动:

public void onNewFileName(Editable filename) {
    LocalActivityManager activityManager = getLocalActivityManager();
    getTabHost().setCurrentTabByTag("Library");
    RecordedLibrary recLib = (RecordedLibrary) activityManager.getActivity("Library");
    recLib.setFileName(filename);
}

最后,我在我的库 (listview) 活动中获得了新文件名:

public void setFileName(final Editable filename) {
    Log.d("2", "Set filename from first activity " + filename);
}

因此,每次我设置文件名时,它都会使用以下代码自动添加到列表视图中:

public void setFileName(final Editable filename) {
    Log.d("2", "Set filename from first activity " + filename);

    //LISTVIEW (declared globally)
    fileNames.add(filename.toString()); 
    listView = (ListView) findViewById (R.id.mainListView);
    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames);
    listView.setAdapter(listAdapter);

现在我接下来要做的是为每个添加的项目自动添加 onItemClickListener。我知道我可以用这样的 switch 语句来做到这一点:

switch (position){
    case 0:
        //code
        break;
}

但这在我的情况下是不可能的,因为每次我记录一个文件时,这个文件都有不同的路径,因为有不同的名称。这就是我尝试这样做的方式:

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            Toast toast = Toast.makeText(getApplicationContext(), filename, Toast.LENGTH_SHORT);
            toast.show();
        }

    });

这也不起作用,因为每次我向列表视图添加一个新文件时,文件名变量都会更改,所以只要我只向列表视图添加一个项目,此代码就可以工作。一旦我将第二个项目添加到列表视图,无论我单击哪个项目,toast 都会显示第二个文件的名称。

希望大家明白问题所在。让我知道我是否应该添加更多信息。

解决方案:

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            Toast toast = Toast.makeText(getApplicationContext(), fileNames.get(arg2), Toast.LENGTH_SHORT);
            toast.show();
        }

    });

如您所见,我只是将“filaname”更改为“fileNames.get(arg2)”,有关更多详细信息,请参阅此答案

4

2 回答 2

1

您不应该在每次设置文件名时都创建和设置新的 ListAdapter。

每个生命周期只应创建一次适配器并将其附加到 ListView 一次,这可能就是为什么第二次添加文件时,只返回第二个文件名的原因。每次调用时,您都会覆盖以前的适配器和数据setFileName

于 2013-08-06T12:57:22.777 回答
1

您不需要为onClickListener列表中的每个对象添加一个。正如您在上面指出的那样,您正在使用单独的活动来容纳您的ListView我会(1)使该活动扩展ListActivity(2)使用onListItemClick

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

}

这样,如果您跟踪以哪个顺序添加哪个文件(上面提到您使用 anArrayList来存储文件名),您可以使用位置或 id 值(取决于支持您的列表的适配器类型)来检索文件名。您可以尝试使用哪个集合最适合检索文件数据(尽管如果您以可预测的顺序添加和删除这些值,则数组列表可能工作正常)。

您也可以使用现有的来执行此操作onItemClickListener。Arg2 是项目在列表中的位置。只需获取该值并从ArrayList存储文件扩展名中获取您需要的文件。

于 2013-08-06T13:11:33.783 回答