2017-06-13 96 views
1

我有一个自定义ListViewImageView,TextViewCheckBox。 对于一些程序员来说,这个问题可能看起来很古老,但我实际上找不到一个确定的解决方案。我的问题是与ImageView。当我滚动图像的变化。ListView滚动错误

一些细节:

  • 我没有使用RecyclerView
  • 为了保持CheckBox状态我使用getTagsetTag方法。他们工作正常。
  • 我想实现一个文件浏览器。
  • 我为几乎所有的文件类型提供了默认图像,包括图像。
  • 里面AsyncTask我想加载图像和视频的缩略图,一旦它们被加载,将它们附加到相应的ImageView。 ---->这是问题。

我无法保持ImageView的位置。即使在滚动非图像ImageView(即,不响应图像或视频)也失去其默认图像。

这里是我的getView代码ListAdapter类中实现:

@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 = 80; 
     viewHolder.iv.getLayoutParams().width = 80; 
     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); 

     final View finalConvertView = convertView; 




     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); 
      //iv.setImageBitmap(null); 

     } 

     @Override 
     protected Bitmap doInBackground(Integer... params) { 
      Bitmap thumb=null; 
      //Log.v("this","position: "+String.valueOf(position)); 

      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); 
       //publishProgress(thumb); 

       //Log.v("this","viewHolderDIB: "+String.valueOf(viewHolder)+"position: "+position); 
       //Log.v("this","filenameDOI: "+String.valueOf(filenames[pos])+" positionDOI: "+String.valueOf(pos)); 
      } 
      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); 
       // Log.v("this","viewHolderDIB: "+String.valueOf(viewHolder)+"position: "+position); 
       // publishProgress(thumb); 

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


     } 
     @Override 
     protected void onPostExecute(Bitmap thumb){ 
      /*if(isCancelled()){ 
       return; 
      } 
*/ 
      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")) { 
        //Log.v("this","filenameOPE: "+String.valueOf(filenames[pos])+" positionOPE: "+String.valueOf(pos)); 
        iv.setImageBitmap(thumb); 
        //iv.setTag(pos); 
        // Log.v("this", "In PU: " + String.valueOf(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")) { 

        // iv.setImageBitmap(thumb); 
       //} 
       //Log.v("this ", "Tag: " + String.valueOf(pos)); 

      } 





     } 
    } 

这里是个文件名包含穿过的主要活动进入名单adapter类文件列表中选择一个文件array

P.S.如果你想,我也可以更新与主要活动的职位。提前致谢。我是一个新手,所以请合作。

回答

1

尝试添加适配器内这两种方法,并检查

@Override 
    public int getViewTypeCount() { 

    return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

    return position; 
    } 
+0

完美!非常感谢你..它的工作原理。 – TheGuy

+1

你的答案太快了......它说4分钟 – TheGuy