Android - 设计问题 - 我应该使用setTag来保存OnClick事件的信息吗?

时间:2015-10-05 18:59:29

标签: java android gridview

我作为Android课程的一部分做了一个小项目。 该应用程序应该使用某些网站的API检索最受欢迎的电影,然后在网格视图中显示它们(使用海报作为缩略图)。 单击特定影片时,将开始提供详细信息的新活动。

我已经走到了这一步:

  1. 使用网站的API获取最受欢迎的电影海报图片网址列表。
  2. 实现了一个扩展ArrayAdapter的适配器,它接受ArrayList作为数据源,并将图像从URL加载到ImageView项目中。
  3. 使用适配器填充GridView。
  4. 使用以下代码在Gridview上设置侦听器:
  5. S:

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v,
                                        int position, long id) {
        //do stuff according to position/view
    }
    

    点击电影时我需要传递给电影细节活动的信息可以在步骤1中获得(我刚刚从json中提取了海报URLS)。 为了能够在点击视图时提供信息,我需要(至少)提取电影的ID并存储它。

    因此看起来我的选择是:

    1. 将ID存储在适配器中。然后,当发生单击时,使用getItem(position)获取ID并使用intent发送它。然后,下一个活动必须向服务器查询电影详细信息。
    2. 这意味着创建一个类:

      static class MovieItem {
         int Id;
         string posterUrl;
      }
      

      转换适配器以使用ArrayList<MovieItem>

      1. 与选项1相同,但使用setTag存储电影的ID。
      2. 与选项1相同,但获取所有必需信息(标题,评级,图表等)并将其存储到MovieItem。在下一个活动中不需要查询。
      3. 与选项3相同,但使用setTag(MovieItem)。在下一个活动中不需要查询。
      4. 我是应用程序开发的新手,我正在尝试以正确的方式完成工作,非常感谢您的帮助。

        编辑: 还想补充一点,如果我在适配器中存储了额外的电影信息,这是不合适的,因为这些信息与该类没有关系?

        感谢您的烦恼! :)

1 个答案:

答案 0 :(得分:0)

当您第一次请求电影信息列表时,您可以将每个电影的详细信息存储在类似HashMap<String, HashMap<String, String>>的内容中,其中String是电影ID,而Map是一组键/值对有关详细信息。然后,当您点击onClick时,您将使用该位置来确定单击了哪个电影海报。然后,您将检索所选电影的详细信息HashMap,将其放入Bundle,将其传递给新Activity的Intent,然后在另一侧检索它。所以代码看起来像这样:

首次检索电影列表时,您会执行以下操作:

//You would put each set of movie data into a HashMap like this...
HashMap<String, HashMap<String, String>> movies = new HashMap<>();

HashMap<String, String> details = new HashMap<>();
details.put("dateReleased", "7.12.2015");
details.put("rating", "PG-13");
details.put("title", "Cool Awesome Movie");
movies.put("12345", details);

//Then when an onClick comes in, you would get the set of 
//details for the movie that was selected (based on position)
HashMap<String, String> selectedDetails = movies.get("12345");

//Put the retrieved HashMap of details into a Bundle
Bundle bundle = new Bundle();
bundle.putSerializable("movieDetails", selectedDetails);

//Send the bundle over to the new Activity with the intent
Intent intent = new Intent(this, YourDetailsActivity.class);
intent.putExtras(bundle);
startActivity(intent);

然后当新活动开始时,您将从onCreate()中的Bundle中检索详细信息:

 //Then in onCreate() of the new Activity...
 Bundle bundle = getIntent().getExtras();
 HashMap<String, String> movieDetails = (HashMap<String, String>) bundle.getSerializable("movieDetails");
 String dateReleased = movieDetails.get("dateReleased");
 String rating = movieDetails.get("rating");
 String title = movieDetails.get("title");