2

我正在使用 GridView 显示许多图像的图像缩略图,因此用户可以选择其中任何一个,我将全屏显示该图像。网格的每个项目都由一个 ImageView 组成,图像是从远程服务器检索的。

当一个项目被触摸时,另一个活动开始全屏显示图像。

在这里,我使用了 Universal Image Loader。在这里,我对 Gridview 使用了与作为通用图像加载器一部分的此类相同的方式。

我以为一切正常,直到我注意到当我滚动屏幕时某些项目被重复并再次加载。

所以我把 displayimage 逻辑convertview== null部分放在了现在每当我向下滚动到网格然后返回时,项目就会改变它的位置并被复制。项目图像视图(缩略图)在许多项目中重复,但其实际内容不同,当我单击该项目时,我可以看到。现在滚动太慢而不是第一个代码。

所以我的主要问题是

如果我使用第一个代码:

1)如果我使用第一个代码,那么当我向下滚动或向上滚动时,图像(项目)会一次又一次地加载。

如果我使用第二个代码:

2) 如果我使用第二个代码,则项目(图像缩略图)显示为重复并显示为其他图像的缩略图。3) Gridview 滚动太慢。

代码:1

public class ImageAdapter extends BaseAdapter {
    ArrayList<GallaryImage> imageList = null;
    private Context context;

    private class ViewHolder {
        public ImageView image;
        public ProgressBar pb;
    }

    public ImageAdapter(final Context context,
            final ArrayList<GallaryImage> imageAttributesList) {
        this.imageList = imageAttributesList;
        this.context = context;

    }

    @Override
    public int getCount() {
        return imageList.size();
    }

    @Override
    public GallaryImage getItem(final int position) {
        return imageList.get(position);
    }

    @Override
    public long getItemId(final int position) {
        return position;
    }

    @Override
    public View getView(final int position, final View convertView,
            final ViewGroup parent) {
        View view = convertView;
        ViewHolder holder = null;
        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater
                    .inflate(R.layout.item_grid_image, parent, false);
            holder = new ViewHolder();
            holder.pb = (ProgressBar) view.findViewById(R.id.pb_grid_image);
            holder.image = (ImageView) view.findViewById(R.id.grid_image);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        display(holder.image, imageList.get(position).mImageUrl, holder.pb);
        return view;
    }

    /**
     * @param img
     * @param url
     * @param spinner
     */
    public void display(ImageView img, String url, final ProgressBar spinner) {
        imageLoader.displayImage(url, img, options,
                new ImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        spinner.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        spinner.setVisibility(View.GONE);

                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        spinner.setVisibility(View.GONE);
                    }

                    @Override
                    public void onLoadingCancelled(String imageUri,
                            View view) {

                    }

                });
    }

    /**
     * @param updateData
     */
    public void updatedData(ArrayList<GallaryImage> imgList) {
        this.imageList = imgList;
        notifyDataSetChanged();
    }
}

代码:2

private static final String TAG = "[Photography: ImageGridActivity]";
private DisplayImageOptions options;
private GridView mGridView = null;
ArrayList<GallaryImage> mGridViewImagesList;
private ImageAdapter mImageAdapter = null;
private String mImageUrl = null;
private String mGallaryTitle = null;

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_image_grid);
    options = new DisplayImageOptions.Builder()
            .showImageOnFail(R.drawable.ic_error)
            .showStubImage(R.drawable.photo_default).cacheOnDisc()
            .bitmapConfig(Bitmap.Config.RGB_565).build();

    final Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        mImageUrl = bundle.getString(Constants.GALLARY_FETCH_URL);

        mGallaryTitle = bundle.getString(Constants.GALLARY_TYPE);
        if (mGallaryTitle != null) {

            Locale loc = Locale.getDefault();
            TextView tvTitleText = (TextView) findViewById(R.id.tv_title_bar_text);
            tvTitleText.setText(mGallaryTitle.toUpperCase(loc));
        }
        mGridView = (GridView) findViewById(R.id.gridview);

        mGridViewImagesList = Utility.getImagesList(mImageUrl,
                ImageGridActivity.this);

        if (mGridViewImagesList != null && !mGridViewImagesList.isEmpty()) {
            mImageAdapter = new ImageAdapter(ImageGridActivity.this,
                    mGridViewImagesList);
            ((GridView) mGridView).setAdapter(mImageAdapter);
        } else {
            // did refresh after the previous images are loaded in the
            // gridview.
            if (Utility.checkConnection(ImageGridActivity.this)) {
                Log.i(TAG,
                        "Wifi/Internet Connection found , have to parse the xml");

                final FetchImagesAsyncTaskFeed asyncTask = new FetchImagesAsyncTaskFeed(
                        true);
                asyncTask.execute(mImageUrl);

            }

        }

        mGridView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(final AdapterView<?> parent,
                    final View view, final int position, final long id) {

                if (mGridViewImagesList != null
                        && !mGridViewImagesList.isEmpty()) {
                    startImagePagerActivity(mGridViewImagesList, position);
                } else {
                    Log.d(TAG, "There is no image about this grid image");
                }
            }
        });

    }

}

/**
 * back button key event
 */
private void goBack() {
    finish();
    // overridePendingTransition(R.anim.slide_in_right,
    // R.anim.slide_out_right);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        goBack();
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

/**
 * @param position
 */
private void startImagePagerActivity(
        final ArrayList<GallaryImage> mImageAttributesList,
        final int position) {
    String[] urls = new String[mImageAttributesList.size()];
    final Intent intent = new Intent(this, ImagePagerActivity.class);
    intent.putExtra(Constants.GALLARY_IMAGE_POSITION_BUNDLE_KEY, position);
    for (int i = 0; i < mImageAttributesList.size(); i++) {
        urls[i] = mImageAttributesList.get(i).mImageUrl;
    }
    intent.putExtra(Constants.GALLARY_IMAGES_IMAGE_BUNDLE_KEY, urls);
    startActivity(intent);
}

public class ImageAdapter extends BaseAdapter {
    ArrayList<GallaryImage> imageList = null;

    private class ViewHolder {
        public ImageView image;
        public ProgressBar pb;
    }

    public ImageAdapter(final Context context,
            final ArrayList<GallaryImage> imageAttributesList) {
        this.imageList = imageAttributesList;

    }

    @Override
    public int getCount() {
        return imageList.size();
    }

    @Override
    public GallaryImage getItem(final int position) {
        return imageList.get(position);
    }

    @Override
    public long getItemId(final int position) {
        return position;
    }

    @Override
    public View getView(final int position, final View convertView,
            final ViewGroup parent) {
        View view = convertView;
        final ViewHolder holder;
        if (convertView == null) {
            view = getLayoutInflater().inflate(R.layout.item_grid_image,
                    parent, false);
            holder = new ViewHolder();
            holder.pb = (ProgressBar) view.findViewById(R.id.pb_grid_image);
            holder.image = (ImageView) view.findViewById(R.id.grid_image);
            view.setTag(holder);
            display(holder.image, imageList.get(position).mImageUrl, holder.pb);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        return view;
    }

    /**
     * @param img
     * @param url
     * @param spinner
     */
    public void display(ImageView img, String url, final ProgressBar spinner) {
        imageLoader.displayImage(url, img, options,
                new ImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        spinner.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        spinner.setVisibility(View.GONE);

                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        spinner.setVisibility(View.GONE);
                    }

                    @Override
                    public void onLoadingCancelled(String imageUri,
                            View view) {

                    }

                });
    }

    /**
     * @param updateData
     */
    public void updatedData(ArrayList<GallaryImage> imgList) {
        this.imageList = imgList;
        notifyDataSetChanged();
    }
}

/**
 * @author
 * 
 */
private class FetchImagesAsyncTaskFeed extends
        AsyncTask<String, Void, String> {
    ProgressBar progressbar = null;
    boolean showProgress = false;

    public FetchImagesAsyncTaskFeed(boolean showProgress) {
        this.showProgress = showProgress;
    }

    @Override
    protected void onPreExecute() {
        if (showProgress) {

            progressbar = (ProgressBar) ImageGridActivity.this
                    .findViewById(R.id.gv_progressBar);
            progressbar.setVisibility(View.VISIBLE);

        }
    }

    @Override
    protected String doInBackground(final String... urls) {
        try {
            final String imageUrl = urls[0];
            final GridViewImagesXMLHandler mGallaryXMLHandler = new GridViewImagesXMLHandler();
            mGridViewImagesList = mGallaryXMLHandler.getImages(imageUrl);
            if (mGridViewImagesList != null
                    && !mGridViewImagesList.isEmpty()) {
                Utility.setImagesInfromation(imageUrl, mGridViewImagesList,
                        ImageGridActivity.this);
            }
        } catch (final Exception e) {
            Log.e(TAG, "Exception in fetch images from the url", e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(final String result) {
        if (mGridViewImagesList != null && !mGridViewImagesList.isEmpty()) {
            if (mImageAdapter != null) {
                mImageAdapter.updatedData(mGridViewImagesList);
                // mPullRefreshGridView.onRefreshComplete();
            } else {
                mImageAdapter = new ImageAdapter(ImageGridActivity.this,
                        mGridViewImagesList);
                ((GridView) mGridView).setAdapter(mImageAdapter);
            }
        }
        // mPullRefreshGridView.onRefreshComplete();
        if (progressbar != null) {
            progressbar.setVisibility(View.GONE);
        }
    }
}

网格视图 XML 文件

<GridView
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/title_bar"
    android:alwaysDrawnWithCache="true"
    android:gravity="center"
    android:horizontalSpacing="4dip"
    android:numColumns="4"
    android:scrollingCache="true"
    android:smoothScrollbar="true"
    android:stretchMode="columnWidth"
    android:verticalSpacing="4dip" />

请帮我解决这个问题。谢谢你的帮助。

谢谢

4

3 回答 3

4

因为我们每次进入getView()时都会设置 ImageView 的背景。每次当一个项目对用户可见时调用getView() (它发生在您滚动时)。由于 BaseAdapter 回收视图,因此我们不得不在 if 和 else 条件之后设置数据。将所有图像保存在一个DiskLruCache中以更快地加载它们并检查它是否存在然后从那里显示其他下载并将其添加到DiskLruCache

于 2013-05-15T04:29:31.087 回答
1

I had also similar problem. I solved it by using ImageAware. And also use UIL 1.9+ version.

     ImageAware imageAware = new ImageViewAware(vh.imageView, false);
     imageLoader.displayImage("drawable://"
     + item.drawableId, imageAware);
于 2015-01-05T03:29:10.210 回答
-2

如果您使用代码 2,我认为您应该这样做:

在检查 if (convertView == null) 之前获取 ProgressBar 和 ImageView:

Image imageView = (ImageView) convertView.findViewById(R.id.grid_image);
ProgressBar progressBar = (Progressbar) convertView.findViewById(R.id.pb_grid_image);
if (convertView == null) {
    convertView = getLayoutInflater().inflate(R.layout.item_grid_image,
            parent, false);
    holder = new ViewHolder();
    holder.pb = (ProgressBar) view.findViewById(R.id.pb_grid_image);
    holder.image = (ImageView) view.findViewById(R.id.grid_image);
    view.setTag(holder);
    display(holder.image, imageList.get(position).mImageUrl, holder.pb);
} else {
    holder = (ViewHolder) view.getTag();
}

imageView = holder.imageView;
return view;
于 2013-05-15T04:36:17.827 回答