在Android中为ListView中的每个项目设置标记?

在Android中为ListView中的每个项目设置标记?,android,android-listview,textview,Android,Android Listview,Textview,我有一个列表视图,我希望每个项目都附加一个ID号(与职位号不同)。我希望在创建这些视图时,可以使用setTag()为ListView中的每个视图项设置一个标记 现在我正在创建ListView,如下所示: final ListView listview = (ListView) findViewById(R.id.listView1); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

我有一个列表视图,我希望每个项目都附加一个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);
final ListView ListView=(ListView)findViewById(R.id.listView1);
ArrayAdapter=新的ArrayAdapter(此,android.R.layout.simple_列表_项_1,android.R.id.text1,名称);
setAdapter(适配器);
上面ArrayAdapter参数中的
names
变量是一个ArrayList,此列表中的每个字符串值也有一个唯一的ID,我希望以某种方式链接到此字符串

是否有任何方法可以使用标记访问和修改每个视图?一个想法是创建我自己的ArrayAdapter扩展类并重写getView()方法,但我真的不明白它是如何工作的,以及我将如何做


或者有没有更好的方法将ID和每个字符串链接在一起,而不是像我正在尝试的那样添加标记

创建一个
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");
        }
    }
}

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

关于getView,它使用了一种循环视图的方法。我将试着用一种简单的方式来解释它

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

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

例如,如果向下滚动,最终用户将隐藏上面的视图,但实际上它将与底部的视图完全相同

为了了解如何使listview具有最佳性能,并在实践中了解它的工作方式和原因,如我所述,请观看以下视频:


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

谢谢您的回答。这个混乱的答案最终可能会更容易,但在我寻求了解更多信息的过程中,我最终根据自己的设计制作了自己的适配器。我将名称和ID传递到适配器中,并将名称设置为TextView的文本,将ID设置为标记

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

谢谢,但是
setViewBinder()
似乎无法与安卓的ArrayAdapter配合使用?Eclipse表示此类型的方法未定义。我遗漏了什么吗?我相信我用的是SimpleAdapter而不是ArrayAdapter