0

複数の写真を選択できるカスタム ギャラリーを実装しています。

から拡張されGridViewた単純なクラスでを使用しています。ImageAdapterBaseAdapter

これが私のImageAdapterクラスです:

public class ImageAdapter extends BaseAdapter {

    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return count;
    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.thumbImage);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.imageview.setId(position);
        holder.imageview.setLongClickable(true);
        holder.imageview.setOnLongClickListener(new OnLongClickListener() {

            public boolean onLongClick(View arg0) {
                int id = arg0.getId();
                ImageView img = (ImageView) arg0;
                if (thumbnailsselection[id]) {
                    Log.d("PRTAG", "deselecting img with id: " + img.getId());
                    img.setBackgroundResource(R.drawable.imgview_noborder);
                    img.setAlpha(255);
                    thumbnailsselection[id] = false;
                } else {
                    Log.d("PRTAG", "selecting img with id: " + img.getId());
                    img.setAlpha(128);
                    img.setBackgroundResource(R.drawable.imgview_border);
                    thumbnailsselection[id] = true;
                }
                return true;
            }
        });

        holder.imageview.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                int id = v.getId();
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse("file://" + arrPath[id]),
                        "image/*");
                startActivity(intent);
            }
        });

        holder.imageview.setImageBitmap(thumbnails[position]);
        holder.id = position;

        return convertView;
    }
}

すべての画像が正しく追加され、onClick()メソッドは正常に機能します (正しい画像が開きます)。

問題はonLongClick(). カスタム背景を追加し、長くクリックされた画像にアルファ ( 128- 選択された画像、 - 選択されていない画像) を設定しています。255実際の選択は正常に機能し、適切な画像が選択されます。

実際の問題は、グリッド ビューをスクロールするときに、背景とアルファが複数の (ランダムな) イメージに設定されることです。

誰もこのようなことを経験しましたか? これを引き起こしている可能性のあるものについて何か考えはありますか?

ありがとう。

4

3 に答える 3

2

getViewビューは再利用可能です。つまり、呼び出されるたびにアルファを更新する必要があります。LongPressに限らず

ArrayList selectedImages選択したすべての画像の ivar を作成します。
- onLongPressに画像を追加/削除しselectedImages
ます -getViewメソッドで、画像がリストに保存されているかどうかを確認し、alpha値に従って設定します

于 2013-03-23T09:44:34.153 に答える
1

メソッドでImageViewの click リスナーと long click リスナーを使用するのではなく、の orのandを使用することをお勧めします。getView()ListViewGridViewsetOnItemLongClickListenersetOnItemClickListener

これらのリスナーでは、選択されているかどうかにかかわらず、アイテムの状態を保存するだけでよく、getView()メソッドではアイテムの状態を検索して次のことを行う必要があります。

            if (thumbnailsselection[id]) {
                Log.d("PRTAG", "deselecting img with id: " + img.getId());
                img.setBackgroundResource(R.drawable.imgview_noborder);
                img.setAlpha(255);
            } else {
                Log.d("PRTAG", "selecting img with id: " + img.getId());
                img.setAlpha(128);
                img.setBackgroundResource(R.drawable.imgview_border);
            }

基本的に、すべてのgetView()呼び出しで、データ オブジェクトの状態を確認し、ビューを返す前に常にビューの状態を調整する必要があります。

于 2013-03-23T09:52:50.420 に答える
1

ListViewビューの再利用の概念に慣れる必要があります。基本的GridViewにスクロール中にビューを再利用します。したがって、ビューを変更すると、明らかに変更されてから再利用されます( でそのプロパティを変更しないまでgetView())。についての詳細な説明が記載された Google I/O ビデオをチェックしください。ListViewGridView

したがって、異なるプロパティを持ついくつかのビューが必要な場合は、次の 2 つのオプションがあります。

  • 別のタイプのビューを作成します (つまり、getItemViewType()getItemViewTypeCount()を使用し、 を呼び出してタイプを動的に変更しますnotifyDataSetChanged())。
  • 特定のアイテムの位置(またはViewHolder、あなたの場合はthumbnailsselection配列情報である可能性のあるある種のフラグ)getView()を保存し、以前に保存された情報を使用して呼び出しごとにビュープロパティを設定します。
于 2013-03-23T09:39:33.283 に答える