使用ImageView

时间:2015-09-16 20:55:28

标签: java xml android-studio

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

我正在学习Udacity课程“开发Android应用程序”,他们要求我们制作一个应用程序,使用TheMovieDB API加载流行电影的图像并将其显示在网格视图中(以及其他内容,但这与现在)。

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

所以我做的是:

  1. 使用片段
  2. 创建了一个空白活动
  3. 创建了一个名为 grid_item_movie.xml
  4. 的新xml文件
  5. 创建了一个由ImageViews而不是Strings
  6. 组成的适配器
  7. 使用Async任务将图像加载到适配器
  8. 这是 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作为根元素。 该应用程序没有崩溃但没有显示,为什么会这样?

1 个答案:

答案 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;
}