2013-08-06 237 views
1

我不太确定如何解释这个问题,但我会尽我所能。我有一个应用程序可以记录声音,并且在完成记录后,必须重命名文件,然后将文件添加到其他活动的列表视图中。添加onItemClickListener到每个列表视图项目,而项目仍然被添加

我有标签的布局,所以将文件添加到列表视图是更复杂一点,这里就是我如何做到这一点:

录制活动:

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

最后,我得到我的库(列表视图)活动中的新文件名:

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

所以,每次我设置一个文件名,它会自动添加,使用此代码的ListView:

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

    }); 

这不起作用,要么是因为每次我添加一个新的文件列表视图,文件名可变的变化,所以这个代码仅适用,只要我只添加一个项目到列表视图。只要我将第二个项目添加到listview中,无论我点击哪个项目,toast都会显示第二个文件的名称。

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

SOLUTION:

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)',请参阅this answer更多的细节。

回答

1

每次设置文件名时,都不应该创建并设置新的ListAdapter。

适配器只应创建一次并在每个生命周期中连接到一个ListView,这可能是第二次添加文件时,只有第二个文件名被返回的原因。每当您拨打setFileName时,您将覆盖以前的适配器和数据。

+0

正确,并且在onItemClick中,您将“文件名”写入未由回调传递的Toast(我不知道从哪里得到),但是应该检查位置(arg2),然后获取来自适配器中相应数据的文件名 – jpm

+0

将其设置为'onCreate' –

+0

@AlexFu对不起,我刚刚删除了我的评论,因为我刚刚在答复之前做了一分钟,但该应用程序仍以同样的方式工作。我试图做jpm告诉我现在要做的事情,但我不知道如何实现这一点。我如何检查位置(arg2)并以这种方式获取文件名? – Guy

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

} 

这样,如果你跟踪哪些文件是在加(您上面提到您使用ArrayList来存储文件名),您可以使用位置或id值(取决于支持列表的是哪种适配器)来检索文件名。您可以玩弄哪些收藏最适合检索文件数据(尽管如果按照可预测的顺序添加和删除这些值,数组列表可能工作正常)。

您也可以使用已有的onItemClickListener来做到这一点。 Arg2是项目在列表中的位置。只需取得该值,并从ArrayList获取需要的文件来存储文件扩展名。