Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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/3/android/184.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 使用AsyncTask在Listview中显示图像_Java_Android_Image_Listview_Android Asynctask - Fatal编程技术网

Java 使用AsyncTask在Listview中显示图像

Java 使用AsyncTask在Listview中显示图像,java,android,image,listview,android-asynctask,Java,Android,Image,Listview,Android Asynctask,我试图用AsyncTask在listview中显示图像,但出现错误。说 尝试调用虚拟方法“java.lang.String” 空对象引用上的java.lang.Object.toString() 这是正在发生的错误 public LoadImage(ImageView imv) { this.imv = imv; this.path = imv.getTag().toString(); } 及 这里是LoadImage.java import android.g

我试图用AsyncTask在listview中显示图像,但出现错误。说

尝试调用虚拟方法“java.lang.String” 空对象引用上的java.lang.Object.toString()

这是正在发生的错误

public LoadImage(ImageView imv) {
        this.imv = imv;
        this.path = imv.getTag().toString();
}

这里是LoadImage.java

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.View;
import android.widget.ImageView;

import java.io.File;

/**
 * Created by Yudii on 27/05/2016.
 */
class LoadImage extends AsyncTask<Object, Void, Bitmap>{

    private ImageView imv;
    private String path;

    public LoadImage(ImageView imv) {
        this.imv = imv;
        this.path = imv.getTag().toString();
    }

    @Override
    protected Bitmap doInBackground(Object... params) {

        Bitmap bitmap = null;
        File file = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + path);

        if (file.exists()) {
            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
        }

        return bitmap;
    }
    @Override
    protected void onPostExecute(Bitmap result) {


        if (!imv.getTag().toString().equals(path)) {
               /* The path is not same. This means that this
                  image view is handled by some other async task.
                  We don't do anything and return. */
          //  return;
        }




        if(result != null && imv != null){
            imv.setVisibility(View.VISIBLE);
            imv.setImageBitmap(result);
        }else{
            imv.setVisibility(View.GONE);
        }
    }

}
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.drawable.BitmapDrawable;
导入android.os.AsyncTask;
导入android.os.Environment;
导入android.view.view;
导入android.widget.ImageView;
导入java.io.File;
/**
*由Yudii于2016年5月27日创建。
*/
类LoadImage扩展了异步任务{
私有ImageView imv;
私有字符串路径;
公共加载映像(ImageView imv){
this.imv=imv;
this.path=imv.getTag().toString();
}
@凌驾
受保护位图doInBackground(对象…参数){
位图=空;
File File=新文件(Environment.getExternalStorageDirectory()
.getAbsolutePath()+路径);
if(file.exists()){
位图=BitmapFactory.decodeFile(file.getAbsolutePath());
}
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
如果(!imv.getTag().toString().equals(路径)){
/*路径不同。这意味着
图像视图由其他异步任务处理。
我们什么都不做就回来*/
//返回;
}
如果(结果!=null&&imv!=null){
imv.setVisibility(View.VISIBLE);
imv.setImageBitmap(结果);
}否则{
imv.setVisibility(View.GONE);
}
}
}
这里是CustomList.java

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class CustomList extends ArrayAdapter<String>{

    private final Activity context;
    private final Integer[] imageId;

    public CustomList(Activity context,
                      String[] web, Integer[] imageId) {
        super(context, R.layout.list_single, web);
        this.context = context;
        this.imageId = imageId;

    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {

        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_single, null, true);

        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);


        LoadImage loadImage = new LoadImage(imageView);
        Bitmap bitmap = loadImage.doInBackground();


        imageView.setImageResource(imageId[position]);

        return rowView;

    }
}
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.graphics.drawable.BitmapDrawable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类CustomList扩展了ArrayAdapter{
私人最终活动背景;
私有最终整数[]imageId;
公共自定义列表(活动上下文,
字符串[]web,整数[]imageId){
super(上下文、R.layout.list_single、web);
this.context=上下文;
this.imageId=imageId;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.list_single,null,true);
ImageView ImageView=(ImageView)rowView.findViewById(R.id.img);
LoadImage LoadImage=新的LoadImage(imageView);
位图Bitmap=loadImage.doInBackground();
setImageResource(imageId[位置]);
返回行视图;
}
}
这里是MainActivity.java

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    ListView list;
    String[] web = {
            "Google Plus",
            "Twitter",
            "Tall",
    };

    Integer[] imageId = {
            R.drawable.gggggggggg,
            R.drawable.hhhhhhhhhh,
            R.drawable.ttttttttttt
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        CustomList adapter = new
                CustomList(MainActivity.this, web, imageId);


        list=(ListView)findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show();

            }
        });

    }
}
导入android.app.Activity;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ListView;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
列表视图列表;
字符串[]web={
“谷歌+”,
“推特”,
“高”,
};
整数[]图像ID={
R.drawable.gggggggggg,
R.drawable.hhhhhhhh,
R.drawable.ttttttttt
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList适配器=新建
CustomList(MainActivity.this、web、imageId);
list=(ListView)findViewById(R.id.list);
list.setAdapter(适配器);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Toast.makeText(MainActivity.this,“您在“+web[+position],Toast.LENGTH_SHORT.show]上单击过它”);
}
});
}
}

您需要更改
loadImage.execute()
而不是
位图Bitmap=loadImage.doInBackground()

您需要更改
loadImage.execute()
而不是
位图Bitmap=loadImage.doInBackground()

为什么需要异步任务?尝试使用库并按一个字符串打开图像:

File file = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath() + path);
Picasso.with(context).load(file).into(imageView);

位图对象非常重,您需要在每个位图图像之后清理内存,以防止OutOfMemoryError。我建议您使用库。

为什么需要异步任务?尝试使用库并按一个字符串打开图像:

File file = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath() + path);
Picasso.with(context).load(file).into(imageView);

位图对象非常重,您需要在每个位图图像之后清理内存,以防止OutOfMemoryError。我建议您使用库。

在依赖项中添加以下内容:-

  compile 'com.squareup.picasso:picasso:2.5.2'
然后加载您的图像:-

   Picasso.with(this)
                .load(drawerImage) // ImagePath
                .placeholder( R.mipmap.download)
                .error( R.mipmap.add_photo)
                .into(imageDrawerView); //ImageView 

将此添加到您的依赖项中:-

  compile 'com.squareup.picasso:picasso:2.5.2'
然后加载您的图像:-

   Picasso.with(this)
                .load(drawerImage) // ImagePath
                .placeholder( R.mipmap.download)
                .error( R.mipmap.add_photo)
                .into(imageDrawerView); //ImageView 

1,原因:

如我所见,在
getView
函数中:

ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
// You need to set tag to your image view
// Ex: imageView.setTag("your_image_file_path") below this line
您的
imageView
没有标记,因此下面的代码将获得
NullPointerException

public LoadImage(ImageView imv) {
    this.imv = imv;
    this.path = imv.getTag().toString(); // Crashed here.
}
另外,我在您的
getView
函数中看到以下代码:

imageView.setImageResource(imageId[position]);
这意味着“您的
ImageView
将设置与定义的
imageId
数组相对应的资源”。因此,您不需要
AsyncTask
类,让我们删除它并更改您的getView,如下所示:

@Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_single, parent, false);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        // Remove below code
        // LoadImage loadImage = new LoadImage(imageView);
        // Bitmap bitmap = loadImage.doInBackground();
        imageView.setImageResource(imageId[position]);
        return rowView;
    }
无论何时使用图像文件的路径,而不是可绘制资源,都需要使用
Asynctask

2,改进:

使用
ListView
RecyclerView
提高性能时,您可以从中了解有关
ViewHolder模式的更多信息。以下是您当前代码的示例:

@Override
        public View getView(int position, View view, ViewGroup parent) {
            View holder = null;
            if (view == null) {
                holder = new ViewHolder();
                LayoutInflater inflater = context.getLayoutInflater();
                view = inflater.inflate(R.layout.list_single, parent, false);
                holder.imageView = (ImageView) view.findViewById(R.id.img);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            holder.imageView.setImageResource(imageId[position]);
            return view;
        }
      static class ViewHolder { // should be static class
           ImageView imageView;
      }

1,原因:

正如我