1

私はSurfaceView私の最初の活動で使用しています。を使用して画像をクリックするSurfaceViewと、最近クリックした画像のパスも格納する 2 番目のアクティビティに移動します。2番目のアクティビティでは、その画像を に表示したいと考えていますGallery

ボタン クリックの 2 番目のアクティビティでは、再び 1 番目のアクティビティに移動し、画像をクリックした後、2 番目のアクティビティに移動します。

2 番目のアクティビティでは、 に表示する必要がある 2 つの画像がありますGallery

私の問題は、最初の画像をクリックした後、Gallery何も表示されないことです。getView()のアダプターセットGalleryが呼び出されることに注意してください。

しかし、2枚目以降の画像をクリックすると、 に画像が2つ以上ある場合Gallery、それらが表示されます。

私も後で試しg.refreshDrawableState();ました

g.setAdapter(new ImageAdapter(this));
g.setOnItemClickListener(this);     
g.setSelection(0, false);

しかし、役に立たない。

ここに書いたことは複雑に聞こえるかもしれませんが、シナリオを視覚化してみてください。

どんな助けでも感謝します。

編集

ImageAdapter.java

public class ImageAdapter extends BaseAdapter {
        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return mImageIds.length;//mImageIds is Array of image paths
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            final String imageUri = mImageIds[position].trim();
            try {
                if (imageUri.length() != 0) {
                    File f = new File(imageUri);
                    if (f.exists()) {
                        b = constants.shrinkBitmap(f.getPath(), 800, 800);
                        d = new BitmapDrawable(getResources(), b);
                        i.setImageDrawable(d);
                    } else {
                        i.setBackgroundColor(Color.WHITE);
                        i.setImageResource(R.drawable.ic_launcher);
                    }
                } else {
                    i.setBackgroundResource(R.drawable.ic_launcher);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            i.setAdjustViewBounds(true);
//BELOW "length" is some predefined value
            i.setPadding(Math.round(length * 0.05f), 0,
                    Math.round(length * 0.05f), 0);
            i.setLayoutParams(new Gallery.LayoutParams(Math
                    .round(length * 0.9f),
                    LayoutParams.WRAP_CONTENT));
            i.setScaleType(ScaleType.FIT_XY);
            return i;
        }
    }

編集 (2)

Vikramの提案の後、長さの値をログに記録しようとしましたが、実際には初めて0でした。i.setLayoutParams(new Gallery.LayoutParams(Math.round(length * 0.9f),LayoutParams.WRAP_CONTENT));

この方法で、length直後にこの変数を設定します。onCreate()

g.post(new Runnable() {
     public void run() {
       length = g.getRight() - g.getLeft();
     }
    });

コードで親レイアウトの幅を取得し、それに応じてギャラリーアイテムの幅を設定したいので。

length0を取得する理由はsetContentView()、有効になるまでに少し時間がかかることを知っています。Adapter が呼び出される前に取得するにはどうすればよいですか?

4

1 に答える 1

1

ここでは変数lengthが問題のようです。値が のzero場合getView()、最初のアイテムが呼び出されたときに、widthパラメーターが に設定されzeroます。

あなたの編集でlengthは、おそらく少し遅れて、実際にゼロ以外の値を取得しています。ビューを更新するには、次の呼び出しを行います。

myAdapter.notifyDataSetChanged();

run()この呼び出しは、 の計算の後に配置する必要がありlengthます。

「点滅」の回避策は問題ありません。別の方法として(ギャラリーの幅が画面の幅と一致する必要がある場合)、これを試してください:

代わりに:

g.post(new Runnable() {
 public void run() {
   length = g.getRight() - g.getLeft();
 }
});

置く:

Point pointSize = new Point();
getWindowManager().getDefaultDisplay().getSize(pointSize);
length = pointSize.x;

アダプターを初期化する前に配置します。

ここで注意すべきもう 1 つのことは、次のようg.getRight()に計算されることです。

g.getRight() = g.getLeft() + g.getWidth()

したがって、 を計算するには、次のlengthようにすることもできます。

length = g.getWidth()

なので:

getWidth() = getRight() - getLeft()
于 2013-07-19T15:25:05.827 に答える