我作为Android课程的一部分做了一个小项目。 该应用程序应该使用某些网站的API检索最受欢迎的电影,然后在网格视图中显示它们(使用海报作为缩略图)。 单击特定影片时,将开始提供详细信息的新活动。
我已经走到了这一步:
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并存储它。
因此看起来我的选择是:
这意味着创建一个类:
static class MovieItem {
int Id;
string posterUrl;
}
转换适配器以使用ArrayList<MovieItem>
。
我是应用程序开发的新手,我正在尝试以正确的方式完成工作,非常感谢您的帮助。
编辑: 还想补充一点,如果我在适配器中存储了额外的电影信息,这是不合适的,因为这些信息与该类没有关系?
感谢您的烦恼! :)
答案 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");