请务必检查编辑,这很重要。
我正在学习Udacity课程“开发Android应用程序”,他们要求我们制作一个应用程序,使用TheMovieDB API加载流行电影的图像并将其显示在网格视图中(以及其他内容,但这与现在)。
我也应该使用Picasso来加载图像。 (https://square.github.io/picasso/)
所以我做的是:
这是 grid_item_movie.xml :
的代码<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:id="@+id/grid_item_movie_imageview">
</TextView>
最初我使用了ImageView而不是TextView,但是我的应用程序崩溃了,它说我必须为adpater提供一个TextView的id。
这是 fragment_main.xml :
的代码<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivityFragment">
<GridView
android:id="@+id/gridview_movies"
android:layout_width="match_parent"
android:layout_height="match_parent">
</GridView>
</FrameLayout>
这是 MainActivityFragment.java 代码的部分(想想我应该只展示什么是重要的,而不是我如何读取JSON数据):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mMovieAdapter = new ArrayAdapter<ImageView>(
getActivity(),
R.layout.grid_item_movie,
R.id.grid_item_movie_imageview,
new ArrayList<ImageView>());
GridView movieGrid = (GridView) rootView.findViewById(R.id.gridview_movies);
movieGrid.setAdapter(mMovieAdapter);
sortMovies newTask = new sortMovies();
newTask.execute("popularity.desc"); // For now, sort by popularity only
return rootView;
}
@Override
protected void onPostExecute(String[] imagesArray)
{
if (imagesArray != null)
{
mMovieAdapter.clear();
ImageView posterImage = new ImageView(getContext());
for (String imageURL : imagesArray)
{
Picasso.with(getContext()).load(imageURL).into(posterImage);
mMovieAdapter.add(posterImage);
}
}
}
当我在手机上启动应用程序时,显然会向我显示文本而不是图像。
阅读关于数组适配器的开发人员文档我知道我需要覆盖getView()方法,但我不知道如何做到这一点。 (我知道重写的是什么,而不是在我压倒的方法中写什么)
我该怎么办?我如何覆盖,或者实际上有更好的方法?
编辑:我已经覆盖了getView()方法,如下所示:
public class ImageAdapter extends ArrayAdapter
{
private final Context context;
private ArrayList<String> imagesURL;
public ImageAdapter(Context context, int resource, ArrayList<String> objects)
{
super(context, resource, objects);
this.context = context;
this.imagesURL = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View myGridView = inflater.inflate(R.layout.grid_item_movie, parent, false);
ImageView moviePoster = (ImageView) myGridView.findViewById(R.id.grid_item_movie_imageview);
Picasso.with(context).load(imagesURL.get(position)).into(moviePoster);
return myGridView;
}
}
OnPostExecute现在是:
protected void onPostExecute(String[] imagesArray)
{
if (imagesArray != null)
{
mMovieAdapter.clear();
ImageView posterImage = new ImageView(getContext());
for (String imageURL : imagesArray)
{
//Picasso.with(getContext()).load(imageURL).into(posterImage);
mMovieAdapter.add(imageURL);
}
}
}
我正在声明ImageAdapter:
mMovieAdapter = new ImageAdapter(
getContext(),
R.layout.grid_item_movie,
new ArrayList<String>());
此外,文件grid_item_movie现在有一个ImageView作为根元素。 该应用程序没有崩溃但没有显示,为什么会这样?
答案 0 :(得分:1)
对列表视图中的每个项目调用一次getView方法。但只有当项目可见时。因此,在实现此方法时,性能至关重要,当用户快速滚动时,滚动将变得不稳定。它涉及重用视图并保留这些视图的引用以帮助提高性能。这里有一个很好的教程http://www.vogella.com/tutorials/AndroidListView/article.html。它非常深入,涵盖了基础和高级主题。这是一个简单的sudocode实现:
private static class ViewHolder {
// holds onto references to views needed in the list view
}
getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// inflate the item view this will be reused as the user scrolls
// perform tasks that are the same across all items
}
// perform tasks that are different for each item
return convertView;
}