5

我有一个 ListView,我希望每个项目都附有一个 ID 号(与位置号不同)。我希望这可以通过在setTag()创建这些视图时为 ListView 中的每个视图项设置一个标签来完成。

现在我正在创建这样的 ListView:

    final ListView listview = (ListView) findViewById(R.id.listView1);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, names);
    listview.setAdapter(adapter);

上面 ArrayAdapter 参数中的names变量是一个 ArrayList,这个列表中的每个字符串值也有一个唯一的 ID,我想以某种方式链接到这个字符串。

有什么方法可以访问和修改带有标签的每个视图?一个想法是创建我自己的 ArrayAdapter 扩展类并覆盖 getView() 方法,但我并不真正了解它是如何工作的以及我将如何去做。

或者有没有更好的方法将 ID 与每个字符串链接起来,而不是像我想要做的那样添加标签?

4

4 回答 4

4

创建一个ViewBinder并设置标签,因为ListView它正在填充您需要的任何内容。您可以检查视图的所有属性以确定哪些标签在哪里,所以这应该是您正在寻找的。

myAdapter.setViewBinder(new MyViewBinder());

public class MyViewBinder implements ViewBinder {
    @Override
    public boolean setViewValue(View view, Object data, String text){
        //Since it iterates through all the views of the item, change accordingly 
        if(view instanceof TextView){ 
            ((TextView)view).setTag("whatever you want");
        }
    }
}

昨天我刚刚在另一个问题上使用了完全相同的答案(尽管略有不同)。

于 2012-05-17T22:08:28.773 回答
1

关于 getView ,它通过使用回收视图的方法来工作。我将尝试以简单的方式解释它。

假设您有大量可以查看的项目。您也不想真正创建大量视图,因为这会占用大量内存。谷歌想到了这一点,并为您提供了仅更新需要在任何特定时间显示的视图的方法。

所以,如果列表视图上有一个空白空间,它将被一个新视图填充。如果用户滚动,隐藏的视图将被回收并在 getView 上返回给您,以使用显示的数据进行更新。

例如,如果您向下滚动,对于最终用户来说,上面的视图会隐藏起来,但实际上它会变成与底部完全相同的视图。

为了了解如何使列表视图具有最佳性能并在实践中了解它如何以及为什么像我所说的那样工作,请观看此视频: http ://www.youtube.com/watch?v=wDBM6wVEO70

至于标签,我认为您想做其他事情,因为数据本身(通常是某种集合,如 arrayList)已经知道在哪里更新,因为您通过 getView 获得位置。如果您想要更新特定视图,您可以通过使用不断更新的 hashmap 来做到这一点,它的键是集合中的位置,值是关联的视图。每次去 getView 时,您都需要删除属于该视图的条目(如果存在),并将新位置分配给您得到/创建的视图。

于 2012-05-17T22:50:40.513 回答
0

我宁愿选择这个线程中讨论的解决方案。将所有相关数据放在同一个位置总是最容易的,在这种情况下,您只需创建一个类来保存每个项目所需的所有信息。

于 2013-02-24T15:53:44.440 回答
0

感谢您的回答。thisMayhem 的答案最终可能会更容易,但为了了解更多信息,我最终根据本教程制作了自己的适配器。我将名称和 ID 传递给适配器,并将名称设置为 TextView 的文本,将 ID 设置为标签。

于 2012-05-18T19:02:53.053 回答