【问题标题】:Set onClickListener for every single listview element为每个列表视图元素设置 onClickListener
【发布时间】:2013-08-06 00:25:48
【问题描述】:

这是我的应用程序的工作原理。用户录制声音,然后给它一个特定的名称。在本例中,我将录制两个声音文件。测试1.mp3 和测试2.mp3。第一次录制完成后,会出现一个对话框,我输入“Test1”,第二次录制也是如此。 Test1.mp3 和 Test2.mp3 现在已添加到列表视图中。这是代码:

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

所以,在我记录了这两个文件并将它们添加到 listview 之后,我想将 onClickListeners 设置为两个 listview 元素。但是我该怎么做呢?如何使每次新的录制文件添加到列表视图时,它也会自动生成 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();
        }

    });

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

【问题讨论】:

标签: java android eclipse android-listview


【解决方案1】:

您不必在每次向列表中添加元素时都添加新的侦听器。 可以一劳永逸地使用OnItemClickListener设置,就能在回调函数中找到被索引点击过的项目

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

即参数int position

在 onItemClick 实现中,您可以检索被点击的元素

arg0.getItemAtPosition(position)

另外,您不必每次都添加 onItemClickListener,您只需在 Activity 的 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();

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

【讨论】:

  • 感谢您的回答!我试过这样做,但有些东西不正常。我添加了 toast 以查看它是否有效,但它没有。当我录制Test1.mp3 时,当我单击该项目时它显示Test1,但是当我录制Test2 时,两个项目都显示Test2,如果你知道我的意思的话。知道会做错什么吗?我不太明白 arg0.getItemAtPosition 部分
  • 奇怪的是,当您将第二个项目添加到列表中时,第一个项目会发生变化。您可以发布在列表中添加新元素的代码吗?我的猜测是该部分的实现方式存在一些问题。
  • 对不起,现在我明白你的意思了。您可能的意思是,在您的 Toast 消息中,您只是不断获得相同的文件名,这是因为您没有通过 arg.getItemAtPosition(position) 获得单击的项目。我用一个几乎完整的工作示例编辑了我的答案,请检查一下;)
【解决方案2】:
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;
    /....
    }
    }):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多