Ich versuche, einen Datei-Explorer zu machen. Ich habe alles erreicht, außer dass meine Bildminiaturen zu langsam geladen wurden. Also lese ich, dass ich zu asynctask wechseln muss und dann in post execute die ui aktualisiere. Vor dem Ausführen von asynctask stelle ich allen meinen Dateien eine Standard-Miniaturansicht zur Verfügung. In asynctask nehme ich Position als Parameter, da ich Tags mit ihnen setze. Dann überprüfe ich die Datei anhand dieser Position. Wenn das Bild oder Video ist, erstelle ich eine Bitmap dafür. In post execute erstelle ich einen neuen Viewholder und weise ihm mit getTag (position) das gleiche Tag zu. Dann weise ich die Bitmap mit setBitmapImage zu. Problem: Thumbnails ändern sich/blinken sogar für die Dateien, die keine Bilder/Videos sind. Dinge, die ich versucht habe bisher: a) updating of Image Thumbnails using AsyncTask for Android ListView not coming proper
b) Android ListView updating of Image Thumbnails using AsyncTask Causes View recyclingBild Thumbnails nicht richtig eingestellt
hier ist mein Code für 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;
}
Alle Vorschläge zur Effizienz oder anderweitig sind sehr willkommen. –