5

Androidマーケットのようなグリッドビューを作成したいのですが、これにインターネット上のデータベースからの画像を入力したいと考えています。2.2 から 4.0 まで実行したいので、androidv4.support で動作する必要があります。

4.0 より前のバージョンではグリッドビューを作成できないと誰かが言っていましたが、本当ですか?

ただし、 use を配置した場合にのみ機能しますsetListAdapter()が、リストビューのように 1 行に 1 つの画像しか表示されず、に変更する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

これは正常に動作するはずです。gridView を使用することはできません。グリッドを手動で管理する場合は、代わりにListFragment単純な古いものを使用してください。Fragment

また、convertView が null かどうかを確認するポイントは、ビューのリサイクルを行うことです。OS は、画面を埋めるのに十分なビューしか宣言しないため、スクロールすると、新しいビューを膨らませる代わりにビューを再利用できます。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

GridViewで aを使用するFragmentことは、 で使用することと何ら変わりはありませんActivity。私があなたのコードで見た明らかなエラーの 1 つは、レイアウトを膨らませてonActivityCreatedからすぐにそれを無視することです。代わりに、ビューの初期化をすべて行う必要がありonCreateViewますLayoutInflater

現在の動作に関しては、なぜそのように動作しているのかは非常に理にかなっています。プログラマーが提供していない場合(現在提供していない)ListFragmentを含むレイアウトを膨らませると思います。設定している は、 に を提供するために使用さListViewれます。ImageAdapterViewListView

したがって、にあるすべてのコードを移動するonActivityCreatedonCreateView、動作するはずです。がアタッチされているときにonActivityCreated特別なことをする必要がない限り、オーバーライドする必要はまったくありません。ActivityFragment

GridView4.0 より前の使用に関してGridViewは、API レベル 1 から使用されているため、すべての Android API レベルで使用しても問題ないと思います。

于 2012-04-24T05:26:36.637 に答える