请务必检查编辑内容,这很重要。
我正在学习 Udacity 类(class)“开发 Android 应用程序”,他们要求我们制作一个应用程序,使用 TheMovieDB API 加载流行电影的图像并在 GridView 中显示它们(还有其他东西,但这与现在)。
我还应该使用 Picasso 来加载图像。 (https://square.github.io/picasso/)
所以我所做的是:
- 使用片段创建了一个空白 Activity
- 创建了一个名为 grid_item_movie.xml 的新 xml 文件
- 创建了一个由 ImageView 而不是字符串组成的适配器
- 使用异步任务将图像加载到适配器中
这是我的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 作为根元素。 应用程序没有崩溃,但没有任何显示,这是为什么?
最佳答案
ListView 中的每个项目都会调用一次 getView 方法。但仅限于该项目可见时。因此,在实现此方法时,性能至关重要,当用户快速滚动时,滚动将会断断续续。它涉及重用 View 并保留这些 View 的引用以帮助提高性能。可以在这里找到一个优秀的教程 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;
}
关于java - 使用 ImageView 填充数组适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618508/