Android ListView BaseAdapter挂起
我的滚动列表视图中出现了一些奇怪的行为。它由BaseAdapter控制 当我向上或向下滚动时,它有时会挂起,然后朝相反的方向反弹。我不知道为什么,也不知道如何解决这个问题 我的基本适配器在下面,它加载了大约90个带有图像和一堆文本的片段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
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);