Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Android 图像缩略图设置不正确_Android_Image_Listview_Android Asynctask - Fatal编程技术网

Android 图像缩略图设置不正确

Android 图像缩略图设置不正确,android,image,listview,android-asynctask,Android,Image,Listview,Android Asynctask,我正在尝试制作一个文件浏览器。我实现了这一切,只是我的图像缩略图加载太慢了。所以我读到我必须移动到asynctask,然后在执行后更新ui。在运行asynctask之前,我为所有文件提供默认缩略图。在asynctask中,我将位置作为参数,因为我使用它们设置标记。然后我用那个位置检查文件。如果是图像或视频,我会为它创建一个位图。在post-execute中,我创建了一个新的viewholder,并使用getTag(position)为其分配相同的标记。然后我使用setBitmapImage分配位

我正在尝试制作一个文件浏览器。我实现了这一切,只是我的图像缩略图加载太慢了。所以我读到我必须移动到asynctask,然后在执行后更新ui。在运行asynctask之前,我为所有文件提供默认缩略图。在asynctask中,我将位置作为参数,因为我使用它们设置标记。然后我用那个位置检查文件。如果是图像或视频,我会为它创建一个位图。在post-execute中,我创建了一个新的viewholder,并使用getTag(position)为其分配相同的标记。然后我使用setBitmapImage分配位图。问题:即使文件不是图像/视频,缩略图也在更改/闪烁。 到目前为止我已经尝试过的事情: a)
(b)

以下是我的getView代码:

@Override
public View getView(final int position,  View convertView, ViewGroup parent) {


    File file=new File(String.valueOf(filenames[position]));
    if(file.isDirectory()){
        img=R.drawable.folder;
    }

    else{
        img=getImage(filenames[position]);
    }

    ViewHolder viewHolder = null;
    if (convertView == null) {
        LayoutInflater inflator = LayoutInflater.from(getContext());
        convertView = inflator.inflate(R.layout.list_item, null);
        viewHolder = new ViewHolder();
        viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
        viewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
        viewHolder.iv= (ImageView)convertView.findViewById(R.id.imageView);
        viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                myList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
            }
        });
        convertView.setTag(viewHolder);
        convertView.setTag(R.id.textView1, viewHolder.tv);
        convertView.setTag(R.id.checkBox1, viewHolder.cb);
        convertView.setTag(R.id.checkBox1, viewHolder.iv);
    }
    else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.iv.getLayoutParams().height = 80;
    viewHolder.iv.getLayoutParams().width = 80;
    viewHolder.cb.setTag(position);
    final ViewHolder ViewHolder= viewHolder;
    ViewHolder.iv.setImageResource(img);
    ViewHolder.tv.setText(myList.get(position).getName());
    ViewHolder.cb.setChecked(myList.get(position).isSelected());


    final View finalConvertView = convertView;
    class myTask extends AsyncTask<Integer,Void,Bitmap>{

        int pos;
        public myTask(int pos){
            this.pos=pos;
        }

        @Override
        protected Bitmap doInBackground(Integer... params) {
            Bitmap thumb=null;

            if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){
                thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[pos])), 64, 64);

            }
            else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")){
                thumb=ThumbnailUtils.createVideoThumbnail(filenames[pos].getPath(), MediaStore.Video.Thumbnails.MINI_KIND);

            }
            return thumb;
        }
        @Override
        protected void onPostExecute(Bitmap thumb){
            if(isCancelled()){
                return;
            }
            ViewHolder v= (ViewHolder) finalConvertView.getTag(pos);

            if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){

                v.iv.setImageBitmap(thumb);
            }
            else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")){

                v.iv.setImageBitmap(thumb);
            }


        }
    }

    myTask m=new myTask(position);
    m.execute();

   return convertView;



}
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
File File=新文件(String.valueOf(filenames[position]);
if(file.isDirectory()){
img=R.drawable.folder;
}
否则{
img=getImage(文件名[位置]);
}
ViewHolder ViewHolder=null;
if(convertView==null){
LayoutInflater充气器=LayoutInflater.from(getContext());
convertView=充气机充气(R.layout.list_项,空);
viewHolder=新的viewHolder();
viewHolder.tv=(TextView)convertView.findViewById(R.id.textView1);
viewHolder.cb=(复选框)convertView.findViewById(R.id.checkBox1);
viewHolder.iv=(ImageView)convertView.findViewById(R.id.ImageView);
viewHolder.cb.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int getPosition=(Integer)buttonView.getTag();//这里我们使用setTag获取为复选框设置的位置。
myList.get(getPosition).setSelected(buttonView.isChecked());//设置复选框的值以保持其状态。
}
});
convertView.setTag(viewHolder);
setTag(R.id.textView1,viewHolder.tv);
setTag(R.id.checkBox1,viewHolder.cb);
convertView.setTag(R.id.checkBox1,viewHolder.iv);
}
否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.iv.getLayoutParams().height=80;
viewHolder.iv.getLayoutParams().width=80;
viewHolder.cb.setTag(位置);
最终视窗持有人视窗持有人=视窗持有人;
ViewHolder.iv.setImageResource(img);
ViewHolder.tv.setText(myList.get(position.getName());
ViewHolder.cb.setChecked(myList.get(position.isSelected());
最终视图finalConvertView=convertView;
类myTask扩展了AsyncTask{
int pos;
公共myTask(int pos){
这个.pos=pos;
}
@凌驾
受保护位图doInBackground(整数…参数){
位图拇指=空;
if((.jpg)valueOf(filenames[pos])包含(“.jpeg”)|| String.valueOf(filenames[pos])包含(“.jpg”)|| String.valueOf(filenames[pos])包含(“.bmp”)| String.valueOf(filenames[pos])包含(“.webp”)| String.valueOf(filenames[pos包含(“.gif”)){
thumb=ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[pos])),64,64;
}
else if((String.valueOf(filenames[pos])包含(“.mp4”)| | String.valueOf(filenames[pos])包含(“.mkv”)| | String.valueOf(filenames[pos])包含(“.3gp”)| String.valueOf(filenames[pos包含(“.3gpp”)){
thumb=ThumbnailUtils.createVideoThumbnail(文件名[pos].getPath(),MediaStore.Video.Thumbnails.MINI_-KIND);
}
回拇指;
}
@凌驾
受保护的void onPostExecute(位图拇指){
如果(isCancelled()){
返回;
}
ViewHolder v=(ViewHolder)finalConvertView.getTag(pos);
if((.jpg)valueOf(filenames[pos])包含(“.jpeg”)|| String.valueOf(filenames[pos])包含(“.jpg”)|| String.valueOf(filenames[pos])包含(“.bmp”)| String.valueOf(filenames[pos])包含(“.webp”)| String.valueOf(filenames[pos包含(“.gif”)){
v、 iv.设置图像位图(拇指);
}
else if((String.valueOf(filenames[pos])包含(“.mp4”)| | String.valueOf(filenames[pos])包含(“.mkv”)| | String.valueOf(filenames[pos])包含(“.3gp”)| String.valueOf(filenames[pos包含(“.3gpp”)){
v、 iv.设置图像位图(拇指);
}
}
}
myTask m=新的myTask(职位);
m、 执行();
返回视图;
}

我终于找到了答案

以下是ListAdapter类:

class ListAdapter extends ArrayAdapter<Modal> {

    private final Context context;
    private int img;

    private List<Modal> myList;
    private File filenames[];
    private List<Integer> selectedItems=new ArrayList<Integer>();
    private CheckBox cb;
    public ListAdapter(Context context, List<Modal> list, File filenames[]) {
        super(context, R.layout.list_item, list);
        this.context = context;
        this.myList = list;
        this.filenames=filenames;
    }


    @Override
    public int getViewTypeCount() {

        if(getCount()>0){
            return getCount();
        }
        return 1;
    }

    @Override
    public int getItemViewType(int position) {

        return position;
    }

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


    static class ViewHolder {
        TextView tv;
        CheckBox cb;
        static ImageView iv;
    }

    public int getImage(File filename){
        if(String.valueOf(filename).contains(".rar")||String.valueOf(filename).contains(".zip")){
            return R.drawable.archive;
        }
        else if(String.valueOf(filename).contains(".doc")||String.valueOf(filename).contains(".docx")){
            return  R.drawable.doc;
        }
        else if(String.valueOf(filename).contains(".pdf")){
            return R.drawable.pdf;
        }
        else if(String.valueOf(filename).contains(".txt")){
            return R.drawable.txt;
        }
        else if(String.valueOf(filename).contains(".ppt")||String.valueOf(filename).contains(".pptx")){
            return R.drawable.ppt;
        }
        else if(String.valueOf(filename).contains(".xls")||String.valueOf(filename).contains(".xlsx")){
            return R.drawable.xls;
        }
        else if((String.valueOf(filename).contains(".jpeg")||String.valueOf(filename).contains(".jpg")||String.valueOf(filename).contains(".png")||String.valueOf(filename).contains(".bmp")||String.valueOf(filename).contains(".webp")||String.valueOf(filename).contains(".gif"))){
            return R.drawable.image;
        }
        else if((String.valueOf(filename).contains(".mp4")||String.valueOf(filename).contains(".mkv")||String.valueOf(filename).contains(".webm")||String.valueOf(filename).contains(".3gp")||String.valueOf(filename).contains(".3gpp"))||String.valueOf(filename).contains(".MOV")){
            return R.drawable.video;
        }
        else if((String.valueOf(filename).contains(".mp3")||String.valueOf(filename).contains(".wav")||String.valueOf(filename).contains(".wma")||String.valueOf(filename).contains(".MP2")||String.valueOf(filename).contains(".AAC")||String.valueOf(filename).contains(".AC3")||String.valueOf(filename).contains(".AU")||String.valueOf(filename).contains(".OGG")||String.valueOf(filename).contains(".FLAC"))){
            return R.drawable.music;
        }

        else {
            return R.drawable.unknown;
        }

    }


    @Override
    public View getView(final int position,  View convertView, ViewGroup parent) {




        File file=new File(String.valueOf(filenames[position]));
        if(file.isDirectory()){
            img=R.drawable.folder;
        }

        else{
            img=getImage(filenames[position]);
        }


        ViewHolder viewHolder = null;

        if (convertView == null) {
            LayoutInflater inflator = LayoutInflater.from(getContext());
            convertView = inflator.inflate(R.layout.list_item, null);
            viewHolder = new ViewHolder();
            viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
            viewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
            viewHolder.iv= (ImageView)convertView.findViewById(imageView);
            viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    myList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });
            convertView.setTag(viewHolder);
            convertView.setTag(R.id.textView1, viewHolder.tv);
            convertView.setTag(R.id.checkBox1, viewHolder.cb);
            convertView.setTag(R.id.checkBox1, viewHolder.iv);
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.iv.getLayoutParams().height = 150;
        viewHolder.iv.getLayoutParams().width = 150;
        viewHolder.cb.setTag(position);
        final ViewHolder ViewHolder= viewHolder;

        ViewHolder.tv.setText(myList.get(position).getName());
        ViewHolder.cb.setChecked(myList.get(position).isSelected());
        viewHolder.iv.setImageResource(img);


        Log.v("this","viewHolderMT: "+String.valueOf(viewHolder)+" position: "+position);
        myTask m=new myTask(position,viewHolder.iv);
        m.execute();

       return convertView;



    }
    class myTask extends AsyncTask<Integer,Bitmap,Bitmap>{



        int pos;
        ImageView iv;
        public myTask(int pos,ImageView iv){
            this.pos=pos;
            this.iv=iv;
            iv.setTag(pos);


        }

        @Override
        protected Bitmap doInBackground(Integer... params) {
            Bitmap thumb=null;


            if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){

                thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[pos])), 150, 150);

            }
            else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")||String.valueOf(filenames[pos]).contains(".MOV")){
                thumb=ThumbnailUtils.createVideoThumbnail(filenames[pos].getPath(), MediaStore.Video.Thumbnails.MINI_KIND);


            }
            return thumb;
        }
        @Override
        protected void onProgressUpdate(Bitmap... thumb){


        }
        @Override
        protected void onPostExecute(Bitmap thumb){


            if(thumb!=null && (Integer)iv.getTag()==this.pos) {
                if ((String.valueOf(filenames[pos])).contains(".jpeg") || String.valueOf(filenames[pos]).contains(".jpg") || String.valueOf(filenames[pos]).contains(".png") || String.valueOf(filenames[pos]).contains(".bmp") || String.valueOf(filenames[pos]).contains(".webp") || String.valueOf(filenames[pos]).contains(".gif")) {

                    iv.setImageBitmap(thumb);

                }
                 else if ((String.valueOf(filenames[pos])).contains(".mp4") ||String.valueOf(filenames[pos]).contains(".MOV")|| String.valueOf(filenames[pos]).contains(".mkv") || String.valueOf(filenames[pos]).contains(".webm") || String.valueOf(filenames[pos]).contains(".3gp") || String.valueOf(filenames[pos]).contains(".3gpp")) {

                    iv.setImageBitmap(thumb);
                }


            }





        }
    }
}
class ListAdapter扩展了ArrayAdapter{
私人最终语境;
私人互联网;
私人名单;
私有文件名[];
private List selectedItems=new ArrayList();
私家车;
公共ListAdapter(上下文上下文、列表、文件名[]){
super(上下文、R.layout.list\u项、列表);
this.context=上下文;
this.myList=list;
this.filenames=文件名;
}
@凌驾
public int getViewTypeCount(){
如果(getCount()>0){
返回getCount();
}
返回1;
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
静态类视窗夹{
文本视图电视;
复选框cb;
静态图像视图iv;
}
public int getImage(文件名){
if(String.valueOf(filename).contains(“.rar”)| | String.valueOf(filename).contains(“.zip”)){
返回R.drawable.archive;
}