Android ListView BaseAdapter挂起

Android ListView BaseAdapter挂起,android,listview,baseadapter,infinite-scroll,Android,Listview,Baseadapter,Infinite Scroll,我的滚动列表视图中出现了一些奇怪的行为。它由BaseAdapter控制 当我向上或向下滚动时,它有时会挂起,然后朝相反的方向反弹。我不知道为什么,也不知道如何解决这个问题 我的基本适配器在下面,它加载了大约90个带有图像和一堆文本的片段 public class PosterListAdapter extends BaseAdapter { private final ArrayList<Poster> listItems; private fin

我的滚动列表视图中出现了一些奇怪的行为。它由BaseAdapter控制

当我向上或向下滚动时,它有时会挂起,然后朝相反的方向反弹。我不知道为什么,也不知道如何解决这个问题

我的基本适配器在下面,它加载了大约90个带有图像和一堆文本的片段

public class PosterListAdapter extends BaseAdapter {

        private final ArrayList<Poster> listItems;

        private final LayoutInflater inflater;

        public PosterListAdapter(ArrayList<Poster> listItems, LayoutInflater inflater) {
            this.listItems = listItems;
            this.categoryList = categoryItems;
            this.inflater = inflater;
        }       


        @Override
        public int getCount() {
            //Log.d("getCount", String.valueOf(this.listItems.size()));
            return this.listItems.size();               
        }

        @Override
        public Poster getItem(int i) {

            return this.listItems.get(i);
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            MyViewHolder mViewHolder;
            SparseArray<String> categoryMap = db.getCategoryMap();

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.catalog_list_fragment, viewGroup, false);
                mViewHolder = new MyViewHolder(convertView);
                convertView.setTag(mViewHolder);
            } else {
                mViewHolder = (MyViewHolder) convertView.getTag();
            }

            //LayoutParams params = (LayoutParams) imageView.getLayoutParams();

            Poster item = this.listItems.get(i);

            String filename = item.getPosterFilename();

            mViewHolder.posterAuthor.setText("Author: "+item.getPresenterFname()+' '+item.getPresenterLname());
            mViewHolder.posterAltAuthors.setText("Supporting Authors: "+item.getPosterAuthors());
            mViewHolder.posterTitle.setText(item.getPosterTitle());
            mViewHolder.posterSynopsis.setText(item.getPosterSynopsis());
            mViewHolder.posterNumber.setText("Poster: "+String.valueOf(item.getPosterNumber()));
            mViewHolder.posterPresentation.setText("Live Presentation: "+item.getSessionDate()+" at "+item.getSessionTime()+"\nAt Station: "+item.getPosterStation());          

            String category = categoryMap.get(item.getCatID());

            mViewHolder.posterCategory.setText("Category: "+category);

            File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "/"+filename+"/"+filename+".png");

//Here I thought maybe the resizing of the image or even the image itself
// was causing the hang up so I tried the list without it and it is still 
// hanging.
            //mViewHolder.imageView.setImageURI(Uri.fromFile(new File(imgFile.toString())));
            if (imgFile.exists()){
                /*Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString());
                int newWidth = 500;
                Bitmap sizedBMP = getResizedBitmap(bmp, newWidth);

                mViewHolder.imageView.setImageBitmap(sizedBMP);*/
            }
            else{
                //set no image available
            }

            return convertView;
        }

        private class MyViewHolder {

            TextView posterTitle, posterAuthor, posterSynopsis, posterCategory, posterNumber, posterAltAuthors,posterPresentation;
            ImageView imageView;

            public MyViewHolder(View item) {
                posterTitle = (TextView) item.findViewById(R.id.poster_title);
                posterAuthor = (TextView) item.findViewById(R.id.poster_author);
                posterAltAuthors = (TextView) item.findViewById(R.id.poster_altAuthors);
                posterSynopsis = (TextView) item.findViewById(R.id.poster_synopsis);
                posterCategory = (TextView) item.findViewById(R.id.poster_category);
                posterNumber = (TextView) item.findViewById(R.id.poster_number);
                posterPresentation = (TextView) item.findViewById(R.id.poster_presentation);

                imageView = (ImageView) item.findViewById(R.id.poster_thumb);
            }
        }
    }
公共类PosterListAdapter扩展BaseAdapter{
私有最终ArrayList列表项;
私人充气机;
公共PosterListAdapter(ArrayList列表项、LayoutFlater充气机){
this.listItems=listItems;
this.categoryList=categoryItems;
这个。充气机=充气机;
}       
@凌驾
public int getCount(){
//Log.d(“getCount”,String.valueOf(this.listItems.size());
返回此.listItems.size();
}
@凌驾
公共海报项目(int i){
返回此.listItems.get(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图转换视图、视图组视图组){
MyViewHolder mViewHolder;
SparseArray categoryMap=db.getCategoryMap();
if(convertView==null){
convertView=充气机。充气(R.layout.catalog\u list\u片段,视图组,false);
mViewHolder=新的MyViewHolder(convertView);
setTag(mViewHolder);
}否则{
mViewHolder=(MyViewHolder)convertView.getTag();
}
//LayoutParams params=(LayoutParams)imageView.getLayoutParams();
海报项目=this.listItems.get(i);
字符串文件名=item.getPosterFilename();
mViewHolder.posterAuthor.setText(“作者:“+item.getPresenterName()+”+item.getPresenterName());
mViewHolder.posterAltAuthors.setText(“支持作者:+item.getPosterAuthors());
mviewolder.posterTitle.setText(item.getPosterTitle());
mViewHolder.posterSynopsis.setText(item.getPosterSynopsis());
mViewHolder.posterNumber.setText(“海报:+String.valueOf(item.getPosterNumber()));
mViewHolder.posterPresentation.setText(“现场演示:“+item.getSessionDate()+”位于“+item.getSessionTime()+”\n站点:“+item.getPosterStation()”);
String category=categoryMap.get(item.getCatID());
mViewHolder.posterCategory.setText(“类别:”+Category);
File imgFile=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(),“/”+filename+“/”+filename+“/”+filename+.png”);
//在这里,我想可能是图像的大小调整,甚至是图像本身
//是导致挂断的原因,所以我尝试了没有挂断的列表,但它仍然存在
//绞刑。
//mViewHolder.imageView.setImageURI(Uri.fromFile(新文件(imgFile.toString()));
if(imgFile.exists()){
/*位图bmp=BitmapFactory.decodeFile(imgFile.toString());
int newWidth=500;
位图sizedBMP=getResizedBitmap(bmp,newWidth);
mViewHolder.imageView.setImageBitmap(sizedBMP)*/
}
否则{
//设置没有可用的图像
}
返回视图;
}
私有类MyViewHolder{
TextView posterTitle、posterAuthor、posterSynopsis、posterCategory、posterNumber、PosterTauthors、posterPresentation;
图像视图图像视图;
公共MyViewHolder(视图项){
posterTitle=(TextView)item.findViewById(R.id.poster\u title);
posterAuthor=(TextView)item.findViewById(R.id.poster\u author);
posterAltAuthors=(TextView)item.findViewById(R.id.poster\u altAuthors);
posterSynopsis=(TextView)item.findViewById(R.id.poster\u大纲);
posterCategory=(TextView)item.findViewById(R.id.poster\U类别);
posterNumber=(TextView)item.findViewById(R.id.poster\u编号);
posterPresentation=(TextView)item.findViewById(R.id.poster\u presentation);
imageView=(imageView)item.findViewById(R.id.poster\u thumb);
}
}
}

我知道这是一大块代码,可能很难看。。如果你能为我指出正确的方向,告诉我如何排除故障,那也会很有帮助。我正在使用eclipse。

如果您注释掉那行
File imgFile=new File(…
(以及依赖于
imgFile
)的代码,我打赌您的列表滚动将得到改进

这仍然是一个I/O操作,由于
getView()
在UI线程中运行,因此可能会导致打嗝

您应该做的是:一旦在
getView()
中有了
ImageView
,就可以启动
AsyncTask
来打开文件,对其进行解码,并将位图分配给
ImageView

然后你必须处理这样的事情:
ImageView
被回收,但是任务没有完成

阅读本文:。它处理来自远程服务器的图像,但所有原则都是一样的

另外:这行是否执行数据库查找?这也可能导致打嗝


TL;DR
getView()
需要快速;在非UI线程中放入慢速操作。

我打赌,如果您注释掉那行
File imgFile=new File(…
(以及依赖于
imgFile
)的代码,列表滚动将得到改进

这仍然是一个I/O操作,由于
getView()
在UI线程中运行,因此可能会导致打嗝

您应该做的是:一旦在
getView()
中有了
ImageView
,就可以启动
异步
repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}
Glide
    .with(context)
    .load(<full path to your local file>)
    .into(mViewHolder.imageView);
Picasso.with(getApplicationContext()).load(<your image path or url or resource id>).into(YourImageView);