2010-03-08 39 views
0

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

回答

1

如果您希望避免使用BaseAdapter的子类,但希望使用基于对象的自定义项目视图和自定义项目点击逻辑,以下是我所做的。

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

所以我现在可以构造一个SimpleAdapter与下列五个参数:

  1. 我的列表(在我的情况下,含活性)
  2. 我的目录(如上所述)的上下文
  3. 的这些项目的自定义布局的标识(R.layout.custom_list_item)
  4. 属性名称的字符串数组。这些是我的ToList方法在HashMap中的键。
  5. 每个项的属性映射在上述(#4)到View衍生元素的id在我的自定义布局

然后,在我的OnItemClickListener.onItemClick方法的int数组,我可以使用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();    
     } 
    });