2013-08-06 52 views
2

以下是我的应用程序的工作原理。用户录制声音,然后给它一个特定的名称。在这个例子中,我将录制两个声音文件。 Test1.mp3和Test2.mp3。第一次完成录音后,出现一个对话框,我输入'Test1',第二次录音也一样。 Test1.mp3和Test2.mp3现在被添加到列表视图。这是代码:为每个单一列表视图元素设置onClickListener

//filename is a variable for the name of the file, these lines execute everytime I record a new file 
ArrayList<String> fileNames = new ArrayList<String>(); 
fileNames.add(filename.toString()); 
listView = (ListView) findViewById (R.id.mainListView); 
listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames); 
listView.setAdapter(listAdapter); 

所以,我录的这两个文件,他们正在添加到列表视图后,我想onClickListeners设置为两个列表视图元素。但我该怎么做?我该如何做到这一点,以便每当新的录制文件已被添加到列表视图,它也会自动生成onclick方法。这不会那么复杂,但是每个录制的文件都有不同的路径。

此刻的代码:

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

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

    }); 

这是每个新文件记录时执行的代码

+1

你的意思是像['onItemClickListener'](http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html)? – Geobits

回答

4

您不必每次添加新的侦听你添加一个元素到名单。 您可以使用OnItemClickListener一套一劳永逸,你就可以发现,已经点击该指数在回调函数

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 

是,参数int position的项目。

里面onItemClick执行,然后你可以检索这已经点击

arg0.getItemAtPosition(position) 

同样的元素,你就不必每次添加onItemClickListener,你可以在onCreate方法一旦做准备您的活动,并永远不会改变它。

当您的新文件记录终止时,您需要做的是创建新适配器(或向适配器添加新项目)。

我准备了一个几乎全样本来说明如何使用ListView:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ArrayList<String> fileNames = new ArrayList<String>(); 
    fileNames.add("Test1.mp3"); 
    fileNames.add("Test2.mp3"); 

    final ListView listView = (ListView) findViewById (R.id.mainListView); 
    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fileNames); 
    listView.setAdapter(listAdapter); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

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

这是不够的,如果在列表中的项目不会改变。

当你的下一个MP3文件的记录终止,并且希望将项目添加到列表中,你可能只是做:

ListView listView = (ListView) findViewById (R.id.mainListView); 
fileNames.add("Test3.mp3"); 
((ArrayAdapter<String>)listView.getAdapter()).notifyDataSetChanged(); 

替换“Test3的”与您的新录制的MP3文件的文件名,它将显示在列表中。

+0

谢谢你的回答!我尝试过,但有些东西不能正常工作。我加了吐司,看它是否有效,但没有。当我记录Test1.mp3时,它显示Test1,当我点击该项目时,但是当我录制Test2时,如果你知道我的意思,那么两个项目都显示Test2。任何想法可以做错什么?我不太明白arg0.getItemAtPosition部分 – Pizzret

+0

奇怪的是,当您向列表中添加第二个项目时,第一个项目会发生更改。你可以发布你添加新元素到列表的代码吗?我的猜测是,该部分实施的方式存在一些问题。 – Lake

+0

我编辑了我原来的帖子,请检查它 – Pizzret

0
listview.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 

    switch(position){ 
    case 0: 
    blablbla 
    break; 
    case1 1: 
    blabla 
    break; 
    /.... 
    } 
    }): 
0

您需要为每个项目指定一个onClick函数。像阿拉伯阿拉伯说的。

相关问题