0

все, У меня возникла проблема с тем, что я использую listView для отображения сотен изображений из своих локальных ресурсов, и я установил изображение, полное экрана. это элемент с ImageView и TextView в каждом элементе списка. Но когда я перехожу к следующему элементу, это не гладко. Я использую ImageFactory.options для настройки масштаба изображений. Но проблема все еще существует. Возможно, я следует использовать асинхронную загрузку и кеш изображений, чтобы исправить эту проблему. вот мой код, надеюсь, что вы придумаете мои проблемы. Большое вам спасибо.Я хочу узнать, как загружать изображения в Asynctask и загружать их в listViewAdapter

package com.jafir.project.adapter; 


import java.util.List; 
import java.util.Map; 

import com.jafir.project.porunacabeza.R; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Handler; 
import android.os.Message; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView.RecyclerListener; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class PicListViewAdapter extends BaseAdapter { 
    private Context context; 
    private Resources resources; 
    private LayoutInflater inflater; 
    private ViewHolder holder; 
    private List<Map<String, Object>> list; 
    public PicListViewAdapter(Context context,List<Map<String, Object>> list) { 
     this.list = list; 
     this.context = context; 
     this.inflater = LayoutInflater.from(context); 
     resources = context.getResources(); 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return null; 
    } 

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

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

     if(convertView == null) { 
      convertView = inflater.inflate(R.layout.item_pic, null); 
      holder = new ViewHolder(); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic); 
      holder.textView = (TextView) convertView.findViewById(R.id.txt_pic); 
      convertView.setTag(holder); 

     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     int resID = (Integer) list.get(position).get("image"); 
     String text = (String) list.get(position).get("text"); 
     holder.imageView.setImageBitmap(decodeBitmap(resources, resID, holder.imageView.getWidth(),   holder.imageView.getHeight())); 
     holder.textView.setText(text); 
     notifyDataSetChanged(); 
     return convertView; 
    } 

    public Bitmap decodeBitmap(Resources res,int id,int width,int height){ 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(res,id,options); 
     options.inSampleSize = getInSampleSize(options,width,height); 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(res,id,options); 
    } 

    public int getInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){ 
     final int width = options.outWidth; 
     final int height = options.outHeight; 
     int inSampleSize = 1; 
     if(height > reqHeight || width > reqWidth) { 
      int radioWidth = Math.round((float)width/(float)reqWidth); 
      int radioHeight = Math.round((float)height/(float)reqHeight); 
      inSampleSize = radioHeight < radioWidth ?radioHeight:radioWidth; 
     } 
     return inSampleSize; 
    } 

     final static class ViewHolder{ 
      ImageView imageView; 
      TextView textView; 
     } 
} 

это для деятельности:

private void init() { 
     listView = (ListView) getActivity().findViewById(R.id.lst_pic); 
     list = new ArrayList<Map<String,Object>>(); 
     for(int i=0;i < texts.length;i++){ 
      Map<String, Object> map = new HashMap<String, Object>(); 
      map.put("image", R.drawable.img0+ i); 
      map.put("text", texts[i]); 
      list.add(map); 
     } 
     listView.setAdapter(new PicListViewAdapter(getActivity(), list)); 
    } 

это для item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
> 

    <ImageView android:id="@+id/img_pic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     /> 
    <TextView android:id="@+id/txt_pic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="15dp" 
     android:gravity="center_horizontal" 
     android:layout_gravity="center_horizontal" 
     /> 


</LinearLayout> 

ответ

0

Если бы я был вами, я бы использовал этот адаптер списка, но в нем для загрузки изображения используется библиотека picasso. Picasso не загружает изображения в поток пользовательского интерфейса. Вот почему вы получаете эту ошибку. После добавления библиотеки попробуйте сделать свой getView() так:

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

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.item_pic, null); 
     holder = new ViewHolder(); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic); 
     holder.textView = (TextView) convertView.findViewById(R.id.txt_pic); 
     convertView.setTag(holder); 

    }else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    int resID = (Integer) list.get(position).get("image"); 
    String text = (String) list.get(position).get("text"); 
    //Picasso code 
    Picasso.Builder builder = new Picasso.Builder(context); 
    Picasso picasso = builder.build(); 
    picasso.load(resID).into(holder.imageView); 
    //End Picasso code 
    holder.textView.setText(text); 
    notifyDataSetChanged(); 
    return convertView; 
} 
+0

ok Благодаря almyz125, есть ли ссылка библиотеки picasso. – Jafir

+0

https://github.com/square/picasso – almyz125

0

Существует полное руководство по Android официальном сайте, пожалуйста, обратитесь в его http://developer.android.com/training/displaying-bitmaps/index.html

Сессии, содержащие следующие темы:

Эффективная загрузка больших растровых изображений В этом уроке вы проведете декодирование больших растровых изображений без превышения предела памяти приложения.

Processing Bitmaps Off пользовательского интерфейса Thread обработки Bitmap (изменение размера, загрузка из удаленного источника, и т.д.) никогда не должно происходить в основном потоке пользовательского интерфейса. В этом уроке вы просматриваете растровые изображения в фоновом потоке с помощью AsyncTask и объясняете, как обращаться с проблемами параллелизма.

Кэширование Bitmaps Этот урок проведет вас через использование кэш-памяти и дискового растровый для улучшения быстродействия и текучестью вашего пользовательского интерфейса при загрузке нескольких растровых изображений.

Управление памятью растровых изображений В этом уроке объясняется, как управлять растровой памятью, чтобы максимизировать производительность вашего приложения.

Отображение растровых изображений в вашем UI Этот урок приносит все вместе, показывая вам, как загрузить несколько растровых изображений в компоненты, такие как ViewPager и GridView с использованием фонового потока и кэш растрового изображения.

+0

Да, спасибо. Я изучаю его. – Jafir

0

Ваша догадка правильная. Я протестировал реализацию с помощью ViewRenderer (https://gist.github.com/tomgibara/1084229) от tomgibara, возможно, за 2 года до этого, что привело к очень плавному выводу. Это хорошо

Если я попытаюсь сделать снимок, я постараюсь создать механизм самостоятельно. Некоторые соображением для справки:

  • Поместите декодированного растровое изображение в LRUCache так, что вы не получите OutOfMemoryError. Серьезно, это возможно, когда вы загружаете лот .
  • Используйте AsyncTask/Loader/Raw Thread как хотите. Нет много разница по существу.
+0

спасибо Лучше Шао. Я узнаю открытый проект – Jafir