Ich habe Tage damit verbracht, einen Datei-Explorer zu implementieren. Ich stecke nur an einem Teil fest. Bilder werden zu langsam geladen! Also bin ich zu asynctask umgezogen. Ich kann den Bildbetrachtungsinhaber nicht korrekt aktualisieren. Hier ist mein Code:Wie genau asynctask verwenden?
@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.tv.setText(myList.get(position).getName());
ViewHolder.cb.setChecked(myList.get(position).isSelected());
Log.v("this","viewHolderMT: "+String.valueOf(viewHolder)+"position: "+position);
final View finalConvertView = convertView;
class myTask extends AsyncTask<Integer,Bitmap,Bitmap>{
int pos;
public myTask(int pos){
this.pos=pos;
}
@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","In DIB: "+String.valueOf(thumb));
//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","In DIB: "+String.valueOf(thumb));
publishProgress(thumb);
}
return thumb;
}
@Override
protected void onProgressUpdate(Bitmap... thumb){
if(isCancelled()){
return;
}
ViewHolder v= (ViewHolder)finalConvertView.getTag();
Log.v("this","viewHolderPU: "+String.valueOf(v)+"position: "+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));
v.iv.setImageBitmap(thumb[0]);
Log.v("this","In PU: "+String.valueOf(thumb[0]));
}
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[0]);
}
}
@Override
protected void onPostExecute(Bitmap thumb){
}
}
myTask m=new myTask(position);
m.execute();
return convertView;
}
Bilder auf verschiedene imageviews laden, auch die imageviews halten auf mit neuen Bildern auf beiden Scrollen und sonst zu blinken. Ich bin so nah an der Lösung, aber irgendwie immer noch fest.
Und es hat wirklich keinen Sinn, die Frage zu verwerfen, wenn Sie die Lösung nicht kennen. –
Die Elemente der Listenansicht werden beim Scrollen wiederverwendet/wiederverwendet. In dem Moment, in dem Sie ein Thumnail haben, wird die Bildansicht dieses Elements bereits für ein anderes Thumbnail verwendet. Ziemlich Standard. Tonnen von Programmierern sind auf dieses Recyclingproblem gestoßen. – greenapps
@greenapps Ich verstehe das. Und ich habe das mit setTag angegangen. Aber das Problem besteht auch, wenn ich nicht mal scroll –