Java 在图像显示在屏幕上之前,在ListView的ImageView中加载图像
我正在开发一款类似9gag的应用程序。 我已经实现了它的大部分,但当我运行应用程序时,从互联网加载的图像在屏幕上显示之前不会加载到ImageView中。我知道ListView就是这样处理回收的,但它看起来并不顺利,因为每次在屏幕上显示列表项时,我都要等待每个列表项加载其图像 您建议我如何改进此问题 我的CustomAdapter类:Java 在图像显示在屏幕上之前,在ListView的ImageView中加载图像,java,android,listview,imageview,Java,Android,Listview,Imageview,我正在开发一款类似9gag的应用程序。 我已经实现了它的大部分,但当我运行应用程序时,从互联网加载的图像在屏幕上显示之前不会加载到ImageView中。我知道ListView就是这样处理回收的,但它看起来并不顺利,因为每次在屏幕上显示列表项时,我都要等待每个列表项加载其图像 您建议我如何改进此问题 我的CustomAdapter类: public class CustomAdapter extends BaseAdapter implements ResultsListener{ Contex
public class CustomAdapter extends BaseAdapter implements ResultsListener{
Context context;
Holder holder;
int postItemsLength=0;
ArrayList<PostItem> postItems;
PlaceholderFragment activity;
private static LayoutInflater inflater=null;
public CustomAdapter(PlaceholderFragment activity, ArrayList<PostItem> postItems) {
// TODO Auto-generated constructor stub
this.activity=activity;
this.context=activity.getContext();
this.postItems = postItems;
inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Log.d("FOUND","entered constructor");
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return postItems.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public void onResultsSucceeded(Bitmap image, int position) {
holder.img.setImageBitmap(image);
CustomAdapter.this.notifyDataSetChanged();
holder.progressBar.setVisibility(View.GONE);
}
public class Holder
{
TextView tv;
TextView imgName;
ImageView img;
WebView wView;
TextView likes;
TextView comments;
TextView op;
ProgressBar progressBar;
FrameLayout webViewLayout;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Holder holder;
Log.d("FOUND","entered GetView");
// Check if the item's view is recycled
if(convertView == null)
{
Log.d("FOUND","convertView is not null");
// The item's view doesn't exist
// Create the item's view
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new Holder(); // Create the holder
holder.tv=(TextView) convertView.findViewById(R.id.titleTextView);
holder.img=(ImageView) convertView.findViewById(R.id.imageView);
holder.likes=(TextView) convertView.findViewById(R.id.likeNumTextView);
holder.comments=(TextView) convertView.findViewById(R.id.commentNumTextView);
holder.imgName = (TextView) convertView.findViewById(R.id.imageNameTextView);
holder.op=(TextView) convertView.findViewById(R.id.opTextView);
holder.webViewLayout = (FrameLayout) convertView.findViewById(R.id.webViewLayout);
holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progressBar);
// Store the holder with the view.
convertView.setTag(holder);
}
else
{
// The item's view already exist
// Retrieve the older
holder = (Holder) convertView.getTag();
Log.d("FOUND","alreay exists");
}
holder.img.setImageResource(R.drawable.empty_img);
holder.tv.setText(postItems.get(position).getTitle());
holder.imgName.setText(postItems.get(position).getImageName());
holder.op.setText(postItems.get(position).getUploader());
holder.likes.setText(postItems.get(position).getLikeNum()+"");
holder.comments.setText(postItems.get(position).getCommentNum()+"");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(getDpWidth(), adjustHeight(postItems.get(position).getWidth(), postItems.get(position).getHeight()));
holder.webViewLayout.setLayoutParams(lp);
DownloadImageTask dTask = new DownloadImageTask(holder.img);
dTask.setOnResultsListener(CustomAdapter.this);
dTask.execute("http://torifi.net/images/" + postItems.get(position).getImageName());
Log.d("FOUND","entered");
//holder.likes.setText(likeNum.get(position));
// holder.comments.setText(commentNum.get(position));
/*
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO impl
}
});
*/
return convertView;
}
public int getDpWidth()
{
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return Math.round(displayMetrics.widthPixels);// / displayMetrics.density);
}
public int adjustHeight (float imageWidth, float imageHeight)
{
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels;// / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels;// / displayMetrics.density;
return Math.round((imageHeight/imageWidth)*dpWidth);
}
}
公共类CustomAdapter扩展BaseAdapter实现ResultsListener{
语境;
持有人;
int positemslength=0;
ArrayList postItems;
片段活性;
专用静态充气机=空;
公共CustomAdapter(占位符片段活动、ArrayList postItems){
//TODO自动生成的构造函数存根
这个。活动=活动;
this.context=activity.getContext();
this.positems=positems;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
Log.d(“找到”、“进入构造函数”);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回positems.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
public void onResultsSuccessed(位图图像,int位置){
holder.img.setImageBitmap(图像);
CustomAdapter.this.notifyDataSetChanged();
holder.progressBar.setVisibility(View.GONE);
}
公共类持有者
{
文本视图电视;
文本视图imgName;
图像视图img;
网络视图;
文本视图喜欢;
文本视图评论;
文本视图操作;
ProgressBar ProgressBar;
框架布局webViewLayout;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持有人;
Log.d(“找到”、“进入GetView”);
//检查项目的视图是否已回收
if(convertView==null)
{
Log.d(“找到”,“convertView不为空”);
//项目的视图不存在
//创建项目的视图
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
convertView=充气机。充气(R.layout.list_项,父项,false);
holder=新holder();//创建holder
holder.tv=(TextView)convertView.findViewById(R.id.titleTextView);
holder.img=(ImageView)convertView.findViewById(R.id.ImageView);
holder.likes=(TextView)convertView.findViewById(R.id.likeumtextView);
holder.comments=(TextView)convertView.findViewById(R.id.commentNumTextView);
holder.imgName=(TextView)convertView.findViewById(R.id.imageNameTextView);
holder.op=(TextView)convertView.findViewById(R.id.opTextView);
holder.webViewLayout=(FrameLayout)convertView.findViewById(R.id.webViewLayout);
holder.progressBar=(progressBar)convertView.findViewById(R.id.progressBar);
//将支架与视图一起存放。
convertView.setTag(支架);
}
其他的
{
//项目的视图已存在
//取回老人
holder=(holder)convertView.getTag();
Log.d(“已找到”、“已存在”);
}
holder.img.setImageResource(R.drawable.empty\u img);
holder.tv.setText(positems.get(position.getTitle());
holder.imgName.setText(positems.get(position.getImageName());
holder.op.setText(positems.get(position.getUploader());
holder.likes.setText(positems.get(position.getlikeum()+);
holder.comments.setText(positems.get(position.getCommentNum()+);
LinearLayout.LayoutParams lp=新的LinearLayout.LayoutParams(getDpWidth(),adjustHeight(positems.get(position.getWidth(),positems.get(position.getHeight());
holder.webViewLayout.setLayoutParams(lp);
DownloadImageTask dTask=新的DownloadImageTask(holder.img);
setOnResultsListener(CustomAdapter.this);
dTask.execute(“http://torifi.net/images/“+positems.get(position.getImageName());
日志d(“找到”、“输入”);
//holder.likes.setText(likum.get(position));
//holder.comments.setText(commentNum.get(position));
/*
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//待办事项
}
});
*/
返回视图;
}
public int getDpWidth()
{
DisplayMetrics DisplayMetrics=context.getResources().getDisplayMetrics();
返回Math.round(displayMetrics.widthPixels);///displayMetrics.density);
}
公共整数调整高度(浮动图像宽度、浮动图像高度)
{
DisplayMetrics DisplayMetrics=context.getResources().getDisplayMetrics();
float dpHeight=displayMetrics.heightPixels;///displayMetrics.density;
float dpWidth=displayMetrics.widthPixels;///displayMetrics.density;
返回数学圆((图像高度/图像宽度)*dpWidth);
}
}
用于加载图像,它会缓存图像,直到图像的uri发生变化,并提供非常快速、平滑的加载体验
您可以像下面的示例一样简单地加载图像
ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this).load("image url").into(imageView);
我认为最好的解决方案是将下载和视图创建分开 您知道要在ListView中显示的数据,因此将图像下载到设备上(例如,下载到如图所示的应用缓存目录中)。 您不必急于下载所有ListView条目的图像。只需跟踪用户的滚动状态,然后开始下载接下来的几张图片
初始化ImageView时,将图像源设置为本地文件,如下所示。Hi。我不认为下载所有的图片会非常有效,因为我的listview是“无限的”。也许每次我都可以下载10个这样的文件,将它们保存在缓存中,然后从缓存中加载。因为我不认为我可以加载500多张图片