在仍添加项目时,将onItemClickListener添加到每个listview项目

时间:2013-08-06 12:50:32

标签: java android eclipse android-listview

我不确定如何解释这个问题,但我会尽我所能。我有一个记录声音的应用程序,在完成录制后,您必须重命名该文件,然后将该文件添加到另一个活动的listview中。

我有标签布局,所以将文件添加到listview有点复杂,我就是这样做的:

录制活动:

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

因此,每次我设置文件名时,它都会自动添加到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添加一个新文件时,filename变量都会改变,所以这个代码只有在我只向listview添加一个项目时才有效。只要我将第二个项目添加到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

2 个答案:

答案 0 :(得分:1)

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

适配器只应创建一次并在每个生命周期附加到ListView一次,这可能是第二次添加文件时,只返回第二个文件名。每次拨打setFileName时,您都会覆盖以前的适配器和数据。

答案 1 :(得分: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存储文件名),你可以使用position或id值(取决于哪种类型)适配器支持您的列表)以检索文件名。您可以使用哪个集合最适合检索文件数据(尽管如果您以可预测的顺序添加和删除这些值,则数组列表可能正常工作)。

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