通过适配器更新 GridView 项目导致项目之间发生冲突

Update GridView Items through Adapter causing conflict between items

我将 GridView 与 BaseAdapter 一起使用,当在 gridview 项目上按下下载时,下载按钮将消失,Circular Progress Drawable 将出现并开始进行,但这里的问题是项目何时下载,我滚动列表 Circular所有项目都出现了进展,这不是这些项目的真实状态,这是一张图片

第一个是真的,第二个是乱七八糟的,应该不会出现循环进度。

这是我的代码和适配器的 getView() 方法:

public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {

            inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.book_item_to_download, parent, false);
            convertView.setFocusable(true);
            convertView.setClickable(true);

            holderGridView = new BooksViewHolder();

            holderGridView.BookImage = (ImageView) convertView.findViewById(R.id.bookBackground);
            holderGridView.BookName = (TextView) convertView.findViewById(R.id.bookName);
            holderGridView.BookItemWraper = (LinearLayout) convertView.findViewById(R.id.book_item_wraper);
            holderGridView.BookDownload=(ImageView) convertView.findViewById(R.id.download);
            holderGridView.BookProgress=(CircularProgressBar) convertView.findViewById(R.id.demo_mpc);

            Typeface custom_font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Isra-Thin.ttf");
            holderGridView.BookName.setTypeface(custom_font);
            convertView.setTag(holderGridView);
        } else {
            holderGridView = (BooksViewHolder) convertView.getTag();
        }

        holderGridView.BookItemWraper.setLayoutParams(new android.widget.AbsListView.LayoutParams((int) Math.round(ScreenWidth / 2.1), (int) Math.round(ScreenHeight / 2.5)));
        holderGridView.BookImage.setImageDrawable(getResources().getDrawable(R.drawable.book_background));
        holderGridView.BookName.setText(bookCovers.get(position).getBookTitle());


        if (bookCovers.get(position).getBookImagePathOnDisk() != null && bookCovers.get(position).getBookImagePathOnDisk().contains("file://")) {
            Picasso.with(mContext).load(bookCovers.get(position).getBookImagePathOnDisk()).into(holderGridView.BookImage);
        } else if (bookCovers.get(position).getBookImagePathOnDisk()!= null) {
            Picasso.with(mContext).load(new File(bookCovers.get(position).getBookImagePathOnDisk())).into(holderGridView.BookImage);
        }

        if(convertView.getId()==bookCovers.get(position).getBookID())
        {
            if(bookCovers.get(position).isDownloaded)
            {
                holderGridView.BookDownload.setVisibility(View.GONE);
                holderGridView.BookProgress.setVisibility(View.GONE);
                holderGridView.BookItemWraper.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        for(int i=0;i<app.bis.size();++i)
                        {
                            if(app.bis.get(i).identifier.equals(bookCovers.get(position).getBookID()+""))
                            {
                                openBookViewer(app.bis.get(i));
                                break;
                            }
                        }
                    }
                });
            }
            else if(bookCovers.get(position).isDownloading)
            {
                holderGridView.BookDownload.setVisibility(View.GONE);
                holderGridView.BookProgress.setVisibility(View.VISIBLE);
                holderGridView.BookProgress.setProgress(bookCovers.get(position).downloadProgress);
                holderGridView.BookItemWraper.setOnClickListener(null);
            }
            else
            {
                holderGridView.BookDownload.setVisibility(View.VISIBLE);

                holderGridView.BookItemWraper.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent openDetails = new Intent(getActivity(), WaitingBookDetails_Activity.class);
                        openDetails.putExtra(Constants.BOOK_COVER, Parcels.wrap(bookCovers.get(position)));
                        startActivity(openDetails);
                    }
                });

                holderGridView.BookDownload.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        new downloadEPUB_Task(bookCovers.get(position),position).execute();
                    }
                });
            }
        }



        return  convertView;
    }

提前致谢

这个问题是因为视图的回收。 添加

 holderGridView.BookProgress.setVisibility(View.GONE);

在你的外部 IF 条件之前

if(convertView.getId()==bookCovers.get(position).getBookID())
        {
..
}

并设置

holderGridView.BookProgress.setVisibility(View.VSIBLE); 

在那些 if 或 else 块中,您希望它显示的位置。