在Android上使用ListViews?

时间:2010-03-08 15:58:33

标签: android listview

我刚刚开始使用Android SDK,我有一个简单的问题。我试图在左侧设置一个带有矩形颜色的ListView,然后为每一行设置一些文本。我也希望这样做,这样我就可以点击列表中的每个条目并打开一个新活动来显示一些信息(类似于联系人列表)。有没有任何例子可以帮助我?

2 个答案:

答案 0 :(得分:1)

如果您希望避免继承BaseAdapter,但希望使用基于对象的自定义项目视图和自定义项目单击逻辑,这就是我所做的。

在我的代码中,我正在处理一些模型对象的集合。我想在ListView中显示这个模型对象的集合。我不能只将ModelObjects的ArrayList传递给SimpleAdapter,因为它需要一个键值对List(类似List<Map<String, Object>>之类的东西)。因此,我没有在我的应用程序中使用我的对象的简单集合,而是创建了一个自定义类来表示我的集合,它只是从我使用的结构派生而来。这样,我可以像往常一样继续使用它,但我可以添加一个方法,将它从代码友好的集合转换为SimpleAdapter友好的集合。在我的例子中,我使用的是由一些字符串属性(即HashMap<String, ModelObject>)键入的HashMap。我的自定义集合类将ModelObjects(复数)扩展HashMap<String, ModelObject>。然后,ModelObjects将包含ToList()方法,我将对象转换为ArrayList<? extends HashMap<String, ?>>,然后我可以将其传递给SimpleAdapter构造函数,以便在带有自定义视图的列表中显示它。

所以现在我可以使用以下五个参数构建一个SimpleAdapter:

  1. 我的列表的上下文(在我的例子中,包含Activity)
  2. 我的清单(如上所述)
  3. 这些项目的自定义布局的ID(R.layout.custom_list_item)
  4. 属性名称的字符串数组。这些是来自ToList方法的HashMap中的键。
  5. 将上面(#4)中每个项目的属性映射到我的自定义布局中的视图派生元素ID的int数组
  6. 然后,在我的OnItemClickListener.onItemClick方法中,我可以使用arg3来获取我单击列表中项目的位置,并使用它来从我的集合中挑选出对象。您可以对项目的任何属性采取行动,或者在对象的某些属性上执行大型切换/案例,以启动特定活动或类似活动。

    唯一的技巧是您需要在未修改的活动中存储集合的本地副本。否则,您可能会在onItemClick中通过id查找对象并获取与您期望的不同的对象。它可能有点脱离上下文,但这是我的代码的样子:

        ListView lvArtists = (ListView)findViewById(R.id.lvArtists);
        SimpleAdapter adapter = new SimpleAdapter(
                this,
                artists.ToList(),
                R.layout.artist_list_item,
                new String[] { "name", "imageIdSmall", "tracksCount", "tracksPending" },
                new int[] { R.id.artistListItemName, R.id.artistListItemImage, R.id.artistListItemAudioClips, R.id.artistListItemAudioClipsPending }
                );
        lvArtists.setAdapter(adapter);
        lvArtists.setOnItemClickListener(new OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                Artist artist = artists.getSortedItem((int)arg3);
                mArtistDialog.setArtist(artist);
                mArtistDialog.show();               
            }
        });
    

答案 1 :(得分:0)

来自Here is an excerpt

one of my books讨论了复杂的列表行,就像您描述的那样。