2017-06-13 18 views
1

私はImageViewTextViewおよびCheckBoxのカスタムListViewを持っています。 この問題は、一部のプログラマーにとっては古代のように見えるかもしれませんが、私は本当に決定的な解決策を見つけることができませんでした。私の問題はImageViewです。スクロールすると画像が変化します。ListViewスクロールエラー

いくつかの詳細は以下のとおりです。

  • 私はgetTagsetTagメソッドを使用していますCheckBoxの状態を維持するためにRecyclerView
  • を使用していません。そして、彼らはうまく働いています。
  • 私はファイルエクスプローラを実装しようとしています。
  • 私は、イメージを含むほぼすべてのファイルタイプのデフォルトイメージを提供しています。
  • 内側AsyncTask画像と動画のサムネイルを読み込み、読み込んだ後に対応するImageViewに添付します。 ---->これが問題です。

私はImageViewの位置を維持することができません。非画像のスクロールでさえ、ImageView(すなわち、画像または動画に対応しないもの)もデフォルト画像を失う。ここで

ListAdapterクラス内に実装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(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