Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在图像显示在屏幕上之前,在ListView的ImageView中加载图像_Java_Android_Listview_Imageview - Fatal编程技术网

Java 在图像显示在屏幕上之前,在ListView的ImageView中加载图像

Java 在图像显示在屏幕上之前,在ListView的ImageView中加载图像,java,android,listview,imageview,Java,Android,Listview,Imageview,我正在开发一款类似9gag的应用程序。 我已经实现了它的大部分,但当我运行应用程序时,从互联网加载的图像在屏幕上显示之前不会加载到ImageView中。我知道ListView就是这样处理回收的,但它看起来并不顺利,因为每次在屏幕上显示列表项时,我都要等待每个列表项加载其图像 您建议我如何改进此问题 我的CustomAdapter类: public class CustomAdapter extends BaseAdapter implements ResultsListener{ Contex

我正在开发一款类似9gag的应用程序。

我已经实现了它的大部分,但当我运行应用程序时,从互联网加载的图像在屏幕上显示之前不会加载到ImageView中。我知道ListView就是这样处理回收的,但它看起来并不顺利,因为每次在屏幕上显示列表项时,我都要等待每个列表项加载其图像

您建议我如何改进此问题

我的CustomAdapter类:

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多张图片