-1

サムネイル画像を含む ListView があります。ListView に表示されているすべての行に問題はありません。しかし、表示されている行の下にある新しい行については、それらのサムネイルに画像を割り当てないようにしImageViewsましたが、最初の行から開始された画像は、表示されている行とまったく同じ順序でコピーされます。サムネイルで画像を割り当てるコード行にブレークポイントを設定しましたImageViewsが、ブレークポイントはヒットしませんが、画像は取得されます。背後にある理論は何ですか?また、表示されている行の下の行で画像の割り当てを自動的に停止するにはどうすればよいですか。ありがとう

EDIT1:

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

        View vi=convertView;
        ViewHolder viewHolder=new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(vi==null){
            vi = inflater.inflate(R.layout.list_row, parent, false);
            viewHolder.id=(TextView)vi.findViewById(R.id.title);
            viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list_image);
            viewHolder.activationStatus = (TextView)vi.findViewById(R.id.activated);
            //lazy load image
            BitmapWorkerTask task = new BitmapWorkerTask(viewHolder.thumbnailImage); 
             //if beyond visible rows, position
             //becomes zero again, at that time cnt is not zero
             //so task is not executed, to prevent image assignment
             //for rows below the visible ones 
            if(position == cnt){
                String id = listIDs.get(position);
                task.execute(id); 
                cnt++;
            }else{
                cnt = 0;

            }

    //Lazy image update
    class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
        private final WeakReference<ImageView> imageViewReference;  
        public BitmapWorkerTask(ImageView imageView) {
            // Use a WeakReference to ensure the ImageView can be garbage collected
            imageViewReference = new WeakReference<ImageView>(imageView);
        }

        // Decode image in background.
        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            dbHelper.open();            
            byte[] img_bytes = dbHelper.getImagebyIDnumber(params[0]);          
            bitmap = BitmapFactory.decodeByteArray(img_bytes, 0, img_bytes.length);        
            dbHelper.close();        
            return bitmap;
        }

        // Once complete, see if ImageView is still around and set bitmap.
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (imageViewReference != null && bitmap != null) {
                final ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(bitmap);
                }
            }
        }   


    }
4

2 に答える 2

0

これは、ListView が非表示になっているビューを可視ビューに再利用するためです。画像を非表示にする場合は、アダプタのgetView()メソッドで明示的に行う必要があります。

于 2013-08-21T13:39:11.080 に答える