5

我想创建一个像 android market 一样的 gridview,我想用来自互联网数据库的图像填充它。它需要与 androidv4.support 一起使用,因为我想运行 2.2 到 4.0。

有人说,在pre-4.0中是不可能创建gridview的,是真的吗?

但是,它仅在我使用 use 时才有效setListAdapter(),但每行仅显示一个图像,例如列表视图,当我更改gridview.setAdapter()为时,它不再起作用。

这是我的尝试:

这是 ListFragment 类:

 public static class ArrayListFragment extends ListFragment implements OnScrollListener{

        ImageAdapter adapter = new ImageAdapter();

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);


                LayoutInflater gridInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View v = gridInflater.inflate(R.layout.imagelist, null);
                GridView gridView = (GridView) v.findViewById(R.id.list);




            ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT;
//            ImageAdapter imageAdapter = new ImageAdapter();
            adapter.getImageDownloader().setMode(mode);
            setListAdapter(adapter); 
//            gridView.setAdapter(adapter);
            getListView().setOnScrollListener(this);

        }

这是 ImageAdapter 类:

    public class ImageAdapter extends BaseAdapter {

            private Context mContext;

        private final ImageDownloader imageDownloader = new ImageDownloader();

            public static int count = 10;

private final String[] URLS = {
        "http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg",
        "http://lh5.ggpht.com/_Z6tbBnE-swM/TB0CryLkiLI/AAAAAAAAVSo/n6B78hsDUz4/s144-c/_DSC3454.jpg",
        "http://lh3.ggpht.com/_GEnSvSHk4iE/TDSfmyCfn0I/AAAAAAAAF8Y/cqmhEoxbwys/s144-c/_MG_3675.jpg",
        "http://lh6.ggpht.com/_Nsxc889y6hY/TBp7jfx-cgI/AAAAAAAAHAg/Rr7jX44r2Gc/s144-c/IMGP9775a.jpg",
        "http://lh3.ggpht.com/_lLj6go_T1CQ/TCD8PW09KBI/AAAAAAAAQdc/AqmOJ7eg5ig/s144-c/Juvenile%20Gannet%20despute.jpg",
        };

            public int getCount() {
                return count;
            }

            public String getItem(int position) {
                return URLS[position];
            }

            public long getItemId(int position) {
                return URLS[position].hashCode();
            }
         public View getView(int position, View convertView, ViewGroup parent) {
                View v;

                if (convertView == null) {
                    v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null);
                    v.setLayoutParams(new GridView.LayoutParams(200,200));

                    ImageView imageview = (ImageView)v.findViewById(R.id.image);
                    imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    imageview.setPadding(6, 6, 6, 6);
                    imageDownloader.download(URLS[position], imageview);
                }
             else {
                v = convertView;
            }

                return v;
            }

            public ImageDownloader getImageDownloader() {
                return imageDownloader;
            }
    }

如果有人有样品,它会很有帮助。谢谢

4

2 回答 2

8

这应该可以正常工作,您不能在 a 中使用 gridView -如果您仍然要手动管理网格,请ListFragment使用普通旧的Fragment

此外,检查 convertView 是否为 null 的目的是进行视图回收 - 操作系统只声明足够的视图来填充屏幕而不是更多,所以如果你滚动,它可以重用视图,而不必膨胀一个新的视图。像这样更改您的 getView() 以利用:

public View getView(int position, View convertView, ViewGroup parent) {
  View v;

  if (convertView == null) {
    v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null);
    v.setLayoutParams(new GridView.LayoutParams(200,200));
  }
  else {
    v = convertView;
  }

  ImageView imageview = (ImageView)v.findViewById(R.id.image);
  imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
  imageview.setPadding(6, 6, 6, 6);
  imageDownloader.download(URLS[position], imageview);

  return v;
}

此外,getView 不是 BaseAdapter 的功能,请尝试切换到 ArrayAdapter。作为旁注,@Override当您认为您正在覆盖基函数时,请始终使用 - 这样,如果您犯了错误,编译器就会给您一个错误

于 2012-04-23T17:56:40.187 回答
1

在 a 中使用 aGridView与在 a 中Fragment使用它应该没有什么不同Activity。我在您的代码中看到的一个明显错误是您正在膨胀布局onActivityCreated,然后立即忽略它。相反,您应该在onCreateView其中方便地提供一个LayoutInflater供您使用的所有视图初始化。

至于它目前的行为,它为什么会如此行事是很有意义的。我相信如果程序员没有提供一个(你目前没有),它会ListFragment膨胀一个包含 a 的布局。ListView然后,ImageAdapter您正在设置的 s 用于将Views 提供给ListView.

因此,将所有代码移至其中onActivityCreatedonCreateView它应该可以工作。你根本不需要覆盖,除非你需要在附加到它时对它onActivityCreated做一些特殊的事情。ActivityFragment

至于使用GridView4.0 之前的版本 -GridView自 API 级别 1 以来就已经存在,所以我敢打赌,将它用于所有 Android API 级别是可以的。

于 2012-04-24T05:26:36.637 回答