java - 使用 ImageView 填充数组适配器

标签 java xml android-studio

请务必检查编辑内容,这很重要。

我正在学习 Udacity 类(class)“开发 Android 应用程序”,他们要求我们制作一个应用程序,使用 TheMovieDB API 加载流行电影的图像并在 GridView 中显示它们(还有其他东西,但这与现在)。

我还应该使用 Picasso 来加载图像。 (https://square.github.io/picasso/)

所以我所做的是:

  1. 使用片段创建了一个空白 Activity
  2. 创建了一个名为 grid_item_movie.xml 的新 xml 文件
  3. 创建了一个由 ImageView 而不是字符串组成的适配器
  4. 使用异步任务将图像加载到适配器中

这是我的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() 方法,但我不知道该怎么做。 (我知道什么是重写,只是不知道在我重写的方法中写什么)

我该怎么办?我如何覆盖,或者实际上有更好的方法吗?

This is what I'm getting right now

<小时/>

编辑:我已经重写了 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/

相关文章:

java - getIntent()用红色写成

java - Selenium Webdriver - 取消选中复杂表格中的所有复选框

java - 从列表中提取 String[] 元素

java - 错误消息 :Failed to execute goal org. apache.maven.plugins :maven-compiler-plugin:3. 5.1:在项目上编译:编译失败

java - 为什么 Java 没有时间线分析器?

java - Android:从 .java 文件设置 strings.xml 值

java - 如何解决某些文件处理失败的错误?

c# - 将嵌套的 XML 元素反序列化为 C# 中的类

android - 更新 Maven 存储库索引

android - "Default activity not found"用于使用 Android Studio 模板创建的可穿戴应用