滚动时GridView无法正常工作

时间:2014-07-17 13:19:55

标签: android gridview scroll baseadapter

我有简单的GridView图像。 GridView中的每个项目都有ImageView,用于显示图片,另一个ImageView在图像被收藏时变为可见(白色星形)。

当我快速滚动到GridView的底部时,例如,在位置3上被收藏和选择的图像不再被选中和被收藏,而是在底部的一些其他项目被随机选择并被收藏。然后当我滚动到顶部时,一些其他项目变得被收藏并随机选择。

但是我注意到这个问题大多只有第二和第三项。

这是最初选择和收藏的项目: This is originaly selected and favorited item

And this item gets randomly selected and favorited at bottom when scrolled to bottom

当滚动到底部时,此项目会随机选择并在底部收藏:

我的适配器:

    public class ImageAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return imageUrls.length;
    }


    @Override
    public long getItemId(int position) {

        return 0;

    }

    public class ViewHolder {
        ImageView imageView;
        ProgressBar progressBar;
        ImageView imgFavorite;
    }

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


        if (convertView == null) {


            convertView = getLayoutInflater().inflate(R.layout.item_grid_image,
                    parent, false);
            holder = new ViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.image);
            holder.progressBar = (ProgressBar) convertView
                    .findViewById(R.id.Itemprogress);
            holder.imgFavorite = (ImageView) convertView
                    .findViewById(R.id.selectorText);
            convertView.setTag(holder);

            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);


            RelativeLayout relative = (RelativeLayout) convertView.findViewById(R.id.profileImageContainer);
            relative.getLayoutParams().height = width;

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        imageLoader.displayImage(imageUrls[position], holder.imageView,
                options, new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        holder.progressBar.setProgress(0);
                        holder.progressBar.setVisibility(View.VISIBLE);
                    }

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

                    }
                }, null);


        if (profilePicList[position].isprofilepic && firstTime
                ) {
            currentPosition = position;
             DefaultImg = convertView;
             holder.imgFavorite.setVisibility(View.VISIBLE);
             firstTime = false;
        }


        return convertView;

    }

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

}

编辑:添加clicklistener代码,我在其中更改所选图像的背景

AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        if(mActionMode == null) {
            mActionMode = startActionMode(mActionModeCallback);
        }




        if (previousView != null) {

            ((ViewGroup) previousView).getChildAt(0).setAlpha(1.0f);
            ((ViewGroup) previousView).setBackgroundResource(0);

        }

        ((ViewGroup) view).setBackgroundResource(R.drawable.back);
        ((ViewGroup) view).getChildAt(0).setAlpha(0.3f);

        previousView = view;


    }

};

2 个答案:

答案 0 :(得分:1)

将其他部分放在一边,这可能会解决您的问题。滚动时,Gridview会重复使用每个图像视图。

if (profilePicList[position].isprofilepic && firstTime
                ) {
            currentPosition = position;
             DefaultImg = convertView;
             holder.imgFavorite.setVisibility(View.VISIBLE); // or INVISIBLE
             firstTime = false;
 }else{
   holder.imgFavorite.setVisibility(View.GONE);
 }

答案 1 :(得分:1)

构建适配器以重用视图,当滚动视图使其不再可见时,它可用于出现的新视图之一。这个重用的View是convertView。

在if条件之后添加此块(当你将imgFavorite传递给VISIBLE时)

else 
{
   holder.imgFavorite.setVisibility(View.GONE);
   firstTime = true;
}